2016-06-28 198 views
1

考慮以下查詢(或直接):LINQ延遲執行

List<GetMultipleLookupListsOutput> data = await _masterListTranslationsRepository 
.GetAll() //<- it returns IQueriable 
.GroupBy(q => q.ListLabelID) 
.Select(q => q 
    .OrderByDescending(w=>w.ISOLanguageCode == isoLanguageCode) 
    .ThenByDescending(w=>w.ISOLanguageCode == "en-US")) 
.Select(q => q.FirstOrDefault()) // DB call ? 
.GroupBy(q=>q.ListLabels.Lists.ListName) 
.Select(q => new GetMultipleLookupListsOutput 
{ 
    ListName = q.Key, 
    LookupLists = q 
     .OrderByDescending(w => w.ISOLanguageCode == isoLanguageCode) 
     .ThenByDescending(w => w.ISOLanguageCode == "en-US") 
     .Select(w => new RegionalFeatureDto 
     { 
      Id = w.Id, 
      Label = w.BaseValue 
     }) 
     .ToList() // DB call ? 
}) 
.ToListAsync(); 

多少數據庫調用它會產生?

GetAll()方法返回IQueryable,但確實FirstOrDefault()ToList()在第二和第三選擇語句會觸發數據庫調用?

任何幫助將不勝感激。

+0

對不起,刪除了我的答案,因爲我意識到它比我想象的要複雜一點。但我想你可以通過簡單地運行代碼並檢查數據庫日誌或調試代碼來得到答案。 –

+0

我同意@RenéVogt,對我來說實際測試您的具體查詢並不容易,但正如我在回答中所述,日誌應該告訴您有多少個調用與查詢相關聯 – chandler

回答

3

如果您關心生成多個呼叫我會考慮使用EntityFramework Extensions

可以批量查詢一起加入。未來()來查詢

實例的結尾:

db.BlogPosts.Where(x => x.Category.Any(y => y.Name.Contains("EntityFramework"))).Future(); 

所以要回答你的問題,你可以把它們組合成一個對數據庫的調用。

要在查詢前檢查SQL /配料還可以包括這樣的:

db.Database.Log = s => System.Diagnostics.Debug.WriteLine($"SQL: {s}"); 

和日誌將被顯示在輸出窗口。