实体框架 - 使用视图加载过多数据

时间:2011-11-23 16:14:58

标签: c# sql-server-2005 entity-framework views

我们在实体之间导航时遇到问题,其中一个实体基于视图。 问题是我们去的时候

TableEntity.ViewEntity.Where(x => x.Id == Id).FirstOrDefault())

在后台,它正在加载视图中的所有记录,这不是我们想要或期望的。

但是当我们去的时候

_objectContext.TableEntityView
    .Where(x => x.TableObjectId == TableObjectId && x.Id == Id)

然后它只加载我们期待的那一行

简而言之,使用导航属性会导致大量数据加载 - 就像早期实现查询一样。

我们正在使用带有SQL 2005数据库的EF 4。这些视图用于提供聚合信息,如果没有大数据加载,EF就无法轻易完成(具有讽刺意义)。我们手动构建了1:视图之间的许多关联。

为什么我们在第一个实例中获得大数据负载而不是第二个实例?

非常感谢所有人/任何帮助

2 个答案:

答案 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在查询中包含该属性