Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ到实体查询优化_C#_Linq_Entity Framework_Entity Framework 4 - Fatal编程技术网

C# LINQ到实体查询优化

C# LINQ到实体查询优化,c#,linq,entity-framework,entity-framework-4,C#,Linq,Entity Framework,Entity Framework 4,我目前有以下逻辑构建了一个包含4个整数的列表,其中每个整数表示某个项目ID(1、2、3或4)的所有投票的总和: List totals=新列表(); 使用(RepositoryEntities entityContext=new RepositoryEntities()) { totals.Add(entityContext.ItemVotes.Count(v=>v.Vote==1)); totals.Add(entityContext.ItemVotes.Count(v=>v.Vote==2)

我目前有以下逻辑构建了一个包含4个整数的列表,其中每个整数表示某个项目ID(1、2、3或4)的所有投票的总和:

List totals=新列表();
使用(RepositoryEntities entityContext=new RepositoryEntities())
{
totals.Add(entityContext.ItemVotes.Count(v=>v.Vote==1));
totals.Add(entityContext.ItemVotes.Count(v=>v.Vote==2));
totals.Add(entityContext.ItemVotes.Count(v=>v.Vote==3));
totals.Add(entityContext.ItemVotes.Count(v=>v.Vote==4));
}
这工作得很好,但我质疑这种查询的效率,因为这似乎实际上生成并执行了4个单独的查询。理想情况下,我希望有一个单一的、高效的查询,返回4个和

有什么想法吗?

提前感谢。

您可以将逻辑封装到一个查询中

totals.AddRange(entityContext.ItemVotes
    .Where(iv => iv.Vote >= 1 && iv.Vote <= 4)
    .GroupBy(iv => iv.Vote)
    .OrderBy(grp => grp.Key)
    .Select(grp => grp.Count());
totals.AddRange(entityContext.ItemVotes)
其中(iv=>iv.投票>=1&&iv.投票iv.投票)
.OrderBy(grp=>grp.Key)
.Select(grp=>grp.Count());

(这段代码未经测试,可能有点离谱,但只是抛出了一个想法)

在LINQ中的.Count()方法强制执行查询。如果您需要4个不同的总计,则没有其他方法可以在一条语句中生成该总计。

可能希望在此处查看,但kvp.值不存在。正在接近。但如果任何投票计数为零,则它们不在列表中。例如,我的原始查询返回一个列表:0、1、3、0。但是你返回的列表只是:1,3。去掉Where子句,没有更改。好吧,这并没有产生我想要的确切结果,但是它足够接近,可以让某人走上正确的道路。谢谢。
totals.AddRange(entityContext.ItemVotes
    .Where(iv => iv.Vote >= 1 && iv.Vote <= 4)
    .GroupBy(iv => iv.Vote)
    .OrderBy(grp => grp.Key)
    .Select(grp => grp.Count());