c# - LINQ 延迟(或立即?)执行

标签 c# linq entity-framework-6

给出以下查询:

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()第三个 select 语句将触发数据库调用?

任何帮助将不胜感激。

最佳答案

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

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

关于c# - LINQ 延迟(或立即?)执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38079586/

相关文章:

asp.net - DropDownList selectedvalue 和表

c# - Entity Framework 6 从现有表创建模型

c# - SQLite-net 在第二次调用 ExecuteNonQuery 时抛出异常

c# - 从 .NET 调用时从 SQL Server 2005 返回的 Xml 原始数据不正确

c# - 确保延迟执行将只执行一次,否则

c# - 服务器套接字在 Close_Wait 中挂起

c# - 用一列对 Linq 列表进行排序

c# - 尝试上传时 Controller 操作未从 View 中抓取文件

c# - 如何删除对其他层中 Entity Framework 的引用

c# - 在 C# 中使用通用存储库时连接多个表