我们在实体之间导航时遇到问题,其中一个实体基于视图。 问题是我们去的时候
TableEntity.ViewEntity.Where(x => x.Id == Id).FirstOrDefault())
在后台,它正在加载视图中的所有记录,这不是我们想要或期望的。
但是当我们去的时候
_objectContext.TableEntityView
.Where(x => x.TableObjectId == TableObjectId && x.Id == Id)
然后它只加载我们期待的那一行
简而言之,使用导航属性会导致大量数据加载 - 就像早期实现查询一样。
我们正在使用带有SQL 2005数据库的EF 4。这些视图用于提供聚合信息,如果没有大数据加载,EF就无法轻易完成(具有讽刺意义)。我们手动构建了1:视图之间的许多关联。
为什么我们在第一个实例中获得大数据负载而不是第二个实例?
非常感谢所有人/任何帮助
答案 0 :(得分:2)
这就是导航集合在EF中的工作方式:访问集合会加载所有实体,此后运行的任何linq查询都只是查询内存中的对象。我认为除了你已经完成的自定义查询之外,你可以做任何事情。
FWIW我被告知NHibernate支持更细粒度的导航加载,但该功能尚未进入实体框架。
修改强>
来自Ladislav Mrnka的This answer显示了CTP日期可能解决您问题的方法。从那以后不确定是否有任何改变。它使用DbContext,因此您仍然无法仅仅浏览导航属性,但它可能就像您将要获得的那样接近。
int count = context.Entry(myAccount)
.Collection(a => a.Orders).Query().Count();`
或者就你的情况而言,我猜它会是
TableEntityView obj = context.Entry(TableEntity)
.Collection(a => a.ViewEntity)
.Query().FirstOrDefault(x => x.Id == Id);
答案 1 :(得分:1)
我对EntityFramework生成SQL的方式有一些问题,所以我首先建议您使用LinqPad以及以下一项或多项:EntityFramework profiler(付费用于软件), SQL事件探查器(假设您使用的是SQL Server)和/或EFTracingProvider
我遇到过一些问题,其中同一个表在内部连接多次查询,因此使用这些工具通常有助于找出导致问题的原因。
我尝试过的东西经常让一些查询运行得更快:
编写完整的Linq查询而不是使用Lambda表达式:它们通常更容易阅读,它们看起来更像sql,因此更容易看到代码与生成的sql之间的关系
和
EntitySet.Include(X => x.Property)
这告诉Linq2Entities在查询中包含该属性