我是 EF 新手,我曾经使用数据集、表适配器和存储过程。我刚刚发现 EF 的简单性,并且发现 EF 方法可以为我的开发提供很多帮助。我有几个问题,我试图寻找他们的答案但徒劳。因为我总是与有以下情况的客户合作巨大的桌子,例如我拨打这个电话的事实:
_ordersContext.Services.ToList()
这是否意味着整个服务表已加载到内存中?如果答案是肯定的(顺便说一句,我认为答案是肯定的),我们可以通过使用 linq 函数来避免内存成本吗?例如 Take() 方法? (我的意思是如果你只想有 10 条记录,无需将整个表加载到内存中)。关于其他 linq 函数的同样问题,例如 where、first、firstordefault、count 等...我的意思是,我们必须加载整个表吗?是否有一个很好的文档讨论如何在最佳实践和内存使用方面使用 EF。
每次看MSDNLINQ方法 https://msdn.microsoft.com/en-us/library/system.linq.enumerable_methods(v=vs.110).aspx。如果你发现这个词deferred您知道该方法不执行查询并且可以与其他方法链接。仅那些不使用的延迟执行将开始处理查询并将结果加载到内存中。
另请记住,您可以强制Linq-To-Objects
无需将所有内容加载到内存中AsEnumerable()
。这会将您的查询转换为 SQL,执行数据库查询并将结果流式传输到内存中。
所以你可以这样做:
var orderList = _ordersContext.Services
.Where(x => somecondition)
.OrderBy(x => x.Column)
.AsEnumerable() // after this you can use any .NET method since it doesnt need to be translated to sql
.Where(x => complex filter not supported by Linq-To-Entities)
.Take(10)
.ToList()
这仍然只会将 10 条记录加载到内存中,并且它使用数据库引擎来(预)过滤或排序,但允许使用 Linq-To-Entities 不支持的 .NET 方法。
Related:
Linq - 找出是否延迟执行的最快方法是什么? https://stackoverflow.com/questions/3894490/linq-what-is-the-quickest-way-to-find-out-deferred-execution-or-not
通常,返回序列的方法使用延迟执行,
返回单个对象的方法则不然。
例外是返回集合的方法,例如ToList
, ToArray
, ToLookup
, ToDictionary
不使用延迟执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)