2016-06-28 201 views
1

考虑以下查询(或直接):LINQ延迟执行

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()在第二和第三选择语句会触发数据库调用?

任何帮助将不胜感激。

+0

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

+0

我同意@RenéVogt,对我来说实际测试您的具体查询并不容易,但正如我在回答中所述,日志应该告诉您有多少个调用与查询相关联 – chandler

回答

3

如果您关心生成多个呼叫我会考虑使用EntityFramework Extensions

可以批量查询一起加入。未来()来查询

实例的结尾:

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

所以要回答你的问题,你可以把它们组合成一个对数据库的调用。

要在查询前检查SQL /配料还可以包括这样的:

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

和日志将被显示在输出窗口。