繁体   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