2011-04-08 83 views
2

我现在有以下逻辑的生成的4个整数,其中每个整数表示的所有票的总和为一定的项目ID的列表(1,2,3或4):LINQ到实体查询优化

List<int> totals = new List<int>(); 

using (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个数字。

任何想法?
在此先感谢。

+0

可能要看看这里http://msdn.microsoft.com/en-us/vcsharp/aa336747#countGrouped – 2011-04-08 21:13:56

回答

5

你可以换你的逻辑放到一个查询

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

(此代码是未经测试,可能是大错特错,但只是抛出一个想法)在LINQ的.Count中()方法强制

+0

看起来很有希望,但kvp.Values不存在。 – Kon 2011-04-11 14:11:25

+0

编辑,使其工作更清晰 – Jimmy 2011-04-11 14:47:18

+0

接近。但是,如果任何票数为零,他们不在列表中。例如,我的原始查询返回一个列表:0,1,3,0。但是您返回的列表只是:1,3.取出Where子句并且没有更改。 – Kon 2011-04-11 19:54:20

-1

执行查询。如果你需要4个不同的总数,没有其他的方法可以在一个语句中产生。