簡體   English   中英

LINQ延遲執行(或立即執行)

[英]LINQ deferred (or immediate?) execution

給定以下查詢:

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 ,但是第二個和第三個select語句中的FirstOrDefault()ToList()是否會觸發數據庫調用?

任何幫助將不勝感激。

如果您擔心產生多個調用,我會考慮使用EntityFramework Extensions

您可以通過在查詢末尾添加.Future()來一起批處理查詢

例:

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

因此,要回答您的問題,您可以將這些合並為一個對數據庫的調用。

要檢查SQL /批處理,您還可以在查詢之前添加以下內容:

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

日志將顯示在您的輸出窗口中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM