我注意到,根据我如何从我的实体框架模型中提取数据,我得到了不同类型的结果。例如,在一个特定的部门,让员工名单时:实体框架 - 从ObjectContext查询与从导航中查询属性
如果我直接从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私有类):
var employees = MyDeparment.Employees.Where(e => e.SomeCondtition)
在下面的代码,我大量使用employees
在几个LINQ查询(Where
,OrderBy
,First
,Sum
等)
我应该考虑到我使用的查询方法?会有性能差异吗?后者是否使用延期执行?是一个更好的做法?或者它没有影响?
我用后一种方法但是使用直接查询时没有问这个,因为自从安装整形6,我收到了大量的IEnumerable警告可能多个枚举。我一直在更频繁地使用后一种方法,只是因为它写得更干净,而且我想知道这样做实际上是否具有不利影响!
谢谢你。在这种情况下,我应该完全避免导航属性,还是等同于确保我在可枚举导航属性上调用CreateSourceQuery()? – Ross
一旦你使用'CreateSourceQuery'你再次使用IQueryable这是OK。导航属性本身不用于查询。他们用于处理相关对象。 –
导航属性是否比遵守查询进行过滤有什么优势? – ManirajSS