2015-10-19 87 views
2

如何在單個select語句中執行此操作?linq select sum and average into view model

var data = new CampaignData() 
{ 
    TotalPost = await context.Campaigns.SumAsync(c => c.Posts), 
    AveragePost = await context.Campaigns.AverageAsync(c => c.Posts), 
    TotalImpression = await context.Campaigns.SumAsync(c => c.Impressions), 
    AverageImpressions = await context.Campaigns.AverageAsync(c => c.Impressions), 
}; 
+0

我想你不能。 – BradleyDotNET

+0

爲什麼不呢?我可以用sql中的一行來完成。 – MIKE

+0

因爲我想不出任何「自動」的方式來做一個枚舉(這基本上是你所要求的)。你當然可以手動做,但是...很難看。除非你的收藏非常大,否則折衷是不值得的。 – BradleyDotNET

回答

6

您可以按常數分組,以便獲得總和和平均值。然後使用SingleAsync來獲得單一結果。

var data = await (from compaign in context.Compaigns 
        group compaign by 1 into grp 
        select new CampaignData() 
        { 
         TotalPost = grp.Sum(cc => cc.Posts), 
         AveragePost = grp.Average(c => c.Posts), 
         TotalImpression = grp.Sum(c => c.Impressions), 
         AverageImpressions = grp.Average(c => c.Impressions), 
        }).SingleAsync(); 

另一種選擇是真正讓你的異步調用數據庫中運行並行

var totalPostTask = context.Campaigns.SumAsync(c => c.Posts); 
var averagePostTask = context.Campaigns.AverageAsync(c => c.Posts); 
var totalImpressionTask = context.Campaigns.SumAsync(c => c.Impressions); 
var averageImpressionsTask = context.Campaigns.AverageAsync(c => c.Impressions); 

await Task.WhenAll(
    totalPostTask, 
    averagePostTask, 
    totalImpressionTask, 
    averageImpressionsTask); 

var data = new CampaignData() 
{ 
    TotalPost = totalPostTask.Result, 
    AveragePost = averagePostTask.Result, 
    TotalImpression = totalImpressionTask.Result, 
    AverageImpressions = averageImpressionsTask.Result, 
}; 

如果我猜我想說的單一數據庫調用會表現得更好,但你隨時可以測試都選擇出去看哪個更好。

+0

只有一個SingleAsync(),它真的用一個查詢來做,但肯定看起來更復雜。無論如何,它不可能是完美的。 –

+0

完美。這個小組是否會影響性能?它是否在sql中生成? – MIKE

+0

FirstOrDefaultAsync會給我同樣的結果嗎?我寧願不碰撞沒有結果。 – MIKE