2011-11-23 59 views
3

我们遇到了在实体之间导航的问题,其中之一基于视图。 问题是,当我们去实体框架 - 视图中的数据加载过多

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

在后台被加载在其中不是我们想要的或希望的视图中的所有记录。

然而,当我们去

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

那么它只是加载了一排是我们所使用的导航属性期待

总之什么原因导致大量的数据负载 - 它就像查询早日实现。

我们将EF 4与SQL 2005数据库结合使用。这些视图用于提供汇总的信息,如果没有大数据负载(具有讽刺意味的),EF无法轻松完成。我们手动构建了1:视图之间的许多关联。

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

非常感谢所有/任何帮助

回答

2

这就是导航集合在EF是如何工作的:访问该集合加载所有实体,并在运行之后,只需要查询对内存中的对象的任何LINQ查询。我不认为你可以做任何事情,因为它没有像你已经完成的自定义查询。

FWIW我被告知NHibernate支持更精细的导航加载,但该功能尚未进入实体框架。

编辑

This answer从拉吉斯拉夫Mrnka显示了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); 
+0

感谢@Adam Rackis。但是,如果我去Table1.Table2.Where(x => x.Id == Id),它肯定不会加载表2中的所有内容。我的理解是,因为它是IQueryable而不是IEnumerable,因此它将所有内容都一次性发送到服务器 - 当您意识到查询(即使用ToList())时触发。否则,导航属性在EF中不可用。 –

+0

是的,你是对的。导航属性不是IQueryable。开箱即用的行为对于大多数情况来说可能是最好的。如果你需要更细粒度的控制,也许NH对你来说会是一个更好的ORM? (这是来自巨大的EF粉丝,顺便说一句) –

+0

@Tim,也见我的编辑。这可能是使用DbContext的可能,但仍然不可能通过犁过对象导航属性 –

1

我有一些问题与的EntityFramework生成SQL所以首先我会建议你使用LinqPad方式和一个或多个以下内容:EntityFramework profiler(支付软件),SQL事件探查器(假设您正在使用SQL Server)和/或EFTracingProvider

我有问题,其中一些查询所以拥有这些工具属lly有助于找出造成问题的原因。

,我已经试过了经常做一些查询的东西跑得更快:

写一个完整的LINQ查询,而不是使用Lambda表达式:他们往往更容易阅读,他们看起来更像是SQL等等它更容易看到您的代码和所生成的SQL的关系

EntitySet.Include(X => x.Property)

这告诉Linq2Entities在查询中包含属性