gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:51:44 26 4
gpt4 key购买 nike

我正在寻找这些 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 Entities 是否正确? EF 在哪里构建更具体的 SQL 语句来传递,将排序工作放在数据库上?

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

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

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

更新:

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

最佳答案

  1. 是的。
  2. 是的。
  3. 是的。

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

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

<小时/>

响应您的更新:

ToList() 始终强制其前面的所有内容立即计算,而不是延迟执行。举个例子:

someEnumerable.Take(10).ToList();

对比

someEnumerable.ToList().Take(10);

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

关于performance - LINQ to Entities -- OrderBy().ToList() 与 ToList().OrderBy(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13827004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com