Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-视图的数据负载过大_C#_Sql Server 2005_Entity Framework_Views - Fatal编程技术网

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也支持这一点,但更糟的是,它有一些缺陷,因为必须显式地打开/关闭延迟加载以避免庞大的查询。