gpt4 book ai didi

linq - Entity Framework - 从 ObjectContext 查询与从导航属性查询

转载 作者:行者123 更新时间:2023-12-05 01:07:54 24 4
gpt4 key购买 nike

我注意到,根据我从 Entity Framework 模型中提取数据的方式,我会得到不同类型的结果。例如,在获取特定部门的员工列表时:

如果我直接从 ObjectContext 拉取,我会得到一个 IQueryable<Employee> , 这实际上是一个 System.Data.Objects.ObjectQuery<Employee> :

var employees = MyObjectContext.Employees.Where(e => e.DepartmentId == MyDepartment.Id && e.SomeCondtition)

但是如果我使用 MyDepartment 的导航属性,我会得到一个 IEnumerable<Employee> , 这实际上是一个 System.Linq.WhereEnumerableIterator<Employee> (System.Linq.Enumerable 中的私有(private)类):

var employees = MyDeparment.Employees.Where(e => e.SomeCondtition)

在接下来的代码中,我大量使用了 employees在几个 LINQ 查询中( WhereOrderByFirstSum 等)

我应该考虑使用哪种查询方法吗?会有性能差异吗?后者是否使用延迟执行?有更好的做法吗?还是没有什么不同?

我问这个是因为自从安装 ReShaper 6 以来,我在使用后一种方法时收到很多Possible multiple enumeration of IEnumerable 警告,但在使用直接查询时却没有。我更经常使用后一种方法,仅仅是因为它写起来更简洁,我想知道这样做是否真的产生了不利影响!

最佳答案

区别很大。

如果您使用第一种方法,您有 IQueryable = exression tree 并且您仍然可以添加其他表达式,并且只有当您执行查询(延迟执行)时,表达式树才会转换为 SQL 并且在数据库中执行。因此,如果您使用第一个示例并添加 .Sum 内容,您确实会在数据库中执行操作,并且它只会将单个数字传输回您的应用程序。那就是 linq-to-entities。

第二个例子用于内存收集。导航属性不代表 IQueryable(表达式树)。所有 linq 命令都被视为 linq-to-objects = 表示导航属性中相关数据的所有记录必须首先从数据库加载到您的应用程序,并且所有操作都在您的应用程序服务器的内存中完成。您可以预先加载导航属性(通过使用 Include)、显式(通过使用 Load)或延迟加载(它只是在您第一次访问该属性时自动完成,如果延迟加载已启用)。因此,如果你想获得一些东西的总和,这个场景需要你从数据库加载所有数据,然后在本地执行操作。

关于linq - Entity Framework - 从 ObjectContext 查询与从导航属性查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6731417/

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