C# 实体框架-视图的数据负载过大
我们在实体之间导航时遇到问题,其中一个实体基于视图。 问题是我们什么时候走C# 实体框架-视图的数据负载过大,c#,sql-server-2005,entity-framework,views,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) 在后台,它正在加载视图中的所有记录,这不是我们想要或期望的 然而当我们走的
TableEntity.ViewEntity.Where(x => x.Id == Id).FirstOrDefault())
_objectContext.TableEntityView
.Where(x => x.TableObjectId == TableObjectId && x.Id == Id)
在后台,它正在加载视图中的所有记录,这不是我们想要或期望的
然而当我们走的时候
TableEntity.ViewEntity.Where(x => x.Id == Id).FirstOrDefault())
_objectContext.TableEntityView
.Where(x => x.TableObjectId == TableObjectId && x.Id == Id)
然后它只加载我们期望的那一行
简言之,使用导航属性会导致大量的数据负载,就像查询很早就实现了一样
我们将EF4与SQL 2005数据库一起使用。这些视图用于提供聚合信息,而如果没有大数据负载,EF将很难做到这一点(具有讽刺意味)。我们已经手动构建了视图之间的1:多个关联
那么,为什么我们在第一个实例中获得了大量的数据负载,而在第二个实例中却没有
非常感谢所有/任何帮助这就是导航集合在EF中的工作方式:访问集合将加载所有实体,此后运行的任何linq查询只需查询内存中的对象即可。我认为除了像您已经做过的那样定制查询之外,您无法对此做任何事情 FWIW我被告知NHibernate支持更细粒度的导航负载,但该特性尚未进入实体框架 编辑 来自Ladislav的Mrnka展示了从CTP日起您的问题的可能解决方案。不确定从那以后是否有什么变化。它使用了DbContext,所以您仍然无法轻松浏览navigation属性,但它可能已经非常接近了
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);
我对EntityFramework生成SQL的方式有一些问题,因此首先我建议您使用以下一种或多种方式:(付费软件)、SQL Profiler(假设您使用的是SQL Server)和/或EFTracingProvider 我遇到过一些问题,在某些查询中,同一个表多次被内部联接,因此使用这些工具通常有助于找出问题的原因 我尝试过的方法经常会使一些查询运行得更快: 编写完整的Linq查询而不是使用Lambda表达式:它们通常更易于阅读,而且看起来更像sql,因此更容易查看代码与生成的sql之间的关系 及 EntitySet.Include(x=>x.Property)
这告诉Linq2Entities在查询中包含属性Thank@Adam Rackis。但如果我转到Table1.Table2.Where(x=>x.Id==Id),它肯定不会加载Table2中的所有内容。我的理解是,因为在封面下,它是IQueryable而不是IEnumerable,然后它将所有要发送到服务器的内容都隐藏起来—当您意识到查询时,即使用ToList()触发。否则,导航属性在EF中不可用。是的,您是对的。导航属性不可查询。在大多数情况下,开箱即用的行为可能是最好的。如果您需要更细粒度的控制,那么NH对您来说可能是一个更好的ORM?(这是来自一个巨大的EF粉丝,顺便说一句)@Tim,也请看我的编辑。使用DbContext可以做到这一点,但仅通过浏览对象导航属性仍然不可能做到这一点看起来非常好。我们使用的是EF4,但看起来这可能值得升级到EF4.1。我们在这里的问题是,我们在两个参数上进行过滤——一个隐式地通过导航属性,另一个通过查询——我们在导航中走错了方向,即我们选择了以某种方式得到最大集的导航。我确信这是最重要的view@Tim:您不需要升级。EFv4也支持这一点,但更糟的是,它有一些缺陷,因为必须显式地打开/关闭延迟加载以避免庞大的查询。