LINQ延迟(或立即?)执行
本文关键字:执行 延迟 LINQ | 更新日期: 2023-09-27 17:52:33
给定以下查询:
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}");
和日志将显示在您的输出窗口