我希望确认/澄清以下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”可能比第一种方法更有优势吗?
更新:
假设我们不使用EntityFramework,只要底层存储库/数据源实现了IQueryable<T>
,这仍然是真的,对吧?如果没有,这两个语句都会在内存中执行LINQ to Objects
操作?
Equals()
或类似翻译问题的例子。 - one.beat.consumermyTable.Where(x => x.Equals(...))
将导致运行时错误。我不是EF大师,所以可能无法解释更多。关键在于调用ToList()
将把所有内容带回到LINQ-to-objects域,这简单且功能更强大,但潜在地要慢得多。 - Jon B