我正在寻找这些 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);
-
我认为第一种方法是否正确LINQ to Entities
EF 在哪里构建更具体的 SQL 语句来传递,将排序工作放在数据库上?
-
是第二种方法LINQ to Objects
其中 LINQ 将整个集合拖入内存(ToList()
枚举?)在订购之前将负担留给服务器端(在本例中为 Web 服务器)?
如果是这种情况,我可以很快看到 L2E 有利的情况(例如,在将集合拉入内存之前过滤/修剪集合)。
-
但是,是否还有其他我应该注意的细节/权衡,或者“方法 2”可能比第一种方法更有利的情况?
UPDATE:
假设我们没有使用 EntityFramework,只要底层存储库/数据源实现,这仍然是正确的IQueryable<T>
正确的?如果这两个语句都没有导致LINQ to Objects
内存中的操作?
- Yes.
- Yes.
- 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(使用前将#替换为@)