LINQ延迟执行(或立即执行) [英] LINQ deferred (or immediate?) execution

查看:59
本文介绍了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();

它将生成多少个数据库调用?

How many database calls will it generate ?

GetAll()方法返回 IQueryable ,但是在第二秒和第二秒中分别执行 FirstOrDefault() ToList()第三条select语句将触发数据库调用?

GetAll() method returns IQueryable, but does FirstOrDefault() and ToList() in second and third select statements will trigger database call ?

任何帮助将不胜感激.

推荐答案

如果您担心产生多个调用,我会考虑使用 EntityFramework扩展

If you are concerned with generating multiple calls I would consider using EntityFramework Extensions

您可以通过在查询末尾添加.Future()来一起批处理查询

You can batch queries together by adding .Future() to the end of a query

示例:

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

因此,要回答您的问题,可以将这些合并为一个对数据库的调用.

So to answer your question you could combine these into one call to the database.

要检查SQL/分批处理,您还可以在查询之前添加以下内容:

To check the SQL/batching you can also include this before your query:

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

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

and the log will be displayed in your output window.

这篇关于LINQ延迟执行(或立即执行)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆