【问题标题】:LINQ deferred (or immediate?) executionLINQ 延迟(或立即?)执行
【发布时间】:2016-06-28 14:53:35
【问题描述】:

给定以下查询:

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()会触发数据库调用吗?

任何帮助将不胜感激。

【问题讨论】:

  • 对不起,删除了我的答案,因为我意识到它比我想象的要复杂一些。但我想你可以通过简单地运行代码并检查数据库日志或调试代码来得到答案。

标签: c# linq entity-framework-6


【解决方案1】:

如果您担心产生多个呼叫,我会考虑使用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}");

日志将显示在您的输出窗口中。

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 2019-12-05
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    相关资源
    最近更新 更多