2011-04-08 82 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個不同的總數,沒有其他的方法可以在一個語句中產生。