LINQ to Entities -- OrderBy().ToList() 与 ToList().OrderBy()

2023-12-27

我正在寻找这些 LINQ 表达式的确认/澄清:

var context = new SomeCustomDbContext()

// LINQ to Entities?
var items  = context.CustomItems.OrderBy(i => i.Property).ToList();

// LINQ to Objects?
var items2 = context.CustomItems.ToList().OrderBy(i => i.Property);
  1. 我认为第一种方法是否正确LINQ to EntitiesEF 在哪里构建更具体的 SQL 语句来传递,将排序工作放在数据库上?

  2. 是第二种方法LINQ to Objects其中 LINQ 将整个集合拖入内存(ToList()枚举?)在订购之前将负担留给服务器端(在本例中为 Web 服务器)?

    如果是这种情况,我可以很快看到 L2E 有利的情况(例如,在将集合拉入内存之前过滤/修剪集合)。

  3. 但是,是否还有其他我应该注意的细节/权衡,或者“方法 2”可能比第一种方法更有利的情况?

UPDATE:

假设我们没有使用 EntityFramework,只要底层存储库/数据源实现,这仍然是正确的IQueryable<T>正确的?如果这两个语句都没有导致LINQ to Objects内存中的操作?


  1. Yes.
  2. Yes.
  3. Yes.

你的呼唤是正确的ToList()强制 linq-to-entities 评估结果并将结果作为列表返回。正如您所怀疑的,这可能会对性能产生巨大的影响。

在某些情况下,linq-to-entities 无法弄清楚如何解析看起来非常简单的查询(例如Where(x => SomeFunction(x)))。在这些情况下,您通常别无选择,只能致电ToList()并对内存中的集合进行操作。


响应您的更新:

ToList()总是强制前面的所有事情立即评估,而不是推迟执行。举个例子:

someEnumerable.Take(10).ToList();

vs

someEnumerable.ToList().Take(10);

在第二个示例中,任何推迟的工作someEnumerable必须在获取前 10 个元素之前执行。如果someEnumerable正在做一些劳动密集型的事情(比如使用从磁盘读取文件Directory.EnumerateFiles()),这可能会对性能产生非常实际的影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ to Entities -- OrderBy().ToList() 与 ToList().OrderBy() 的相关文章

随机推荐