实体框架、linq 函数和内存使用

Meh*_*egi 4 c# linq entity-framework

我是 EF 的新手,我曾经使用过数据集、表适配器和存储过程。我刚刚发现了 EF 的简单性,并且发现 EF 方法对我的开发有很大帮助。我有几个问题,我试图寻找他们的答案,但徒劳无功。由于我总是与拥有大桌子的客户合作,因此我进行此调用的事实例如:

_ordersContext.Services.ToList()
Run Code Online (Sandbox Code Playgroud)

这是否意味着整个服务表被加载到内存中?如果答案是肯定的(顺便说一下,我认为答案是肯定的),我们可以通过使用 linq 函数来避免内存成本吗?例如 Take() 方法?(我的意思是如果你只想有 10 条记录,而不需要在内存中加载整个表)。关于其他 linq 函数的相同问题,如 where、first、firstordefault、count 等......我的意思是,我们是否必须加载整个表?是否有一个很好的文档来讨论如何在最佳实践和内存使用方面使用 EF。

Tim*_*ter 5

查看 MSDN 中的每个LINQ 方法。如果您发现术语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()
Run Code Online (Sandbox Code Playgroud)

这仍然只会将 10 条记录加载到内存中,并且它使用数据库引擎来(预)过滤或排序,但允许使用 Linq-To-Entities 不支持的 .NET 方法。

有关的:

Linq - 找出延迟执行的最快方法是什么?

通常,返回序列的方法使用延迟执行,而返回单个对象的方法则不使用。

例外是返回集合(如ToList, ToArray, )的方法ToLookupToDictionary它们不使用延迟执行。