我期待成是关系到一个问题... Join and Include in Entity FrameworkLINQ中,争相模仿连接,以及包括方法
基本上下面的查询返回“属性”列表中的对象当前用户有权限( ACL)来查看。
IQueryable<Property> currPropList
= from p in ve.Property
.Include("phyAddress")
.Include("Contact")
from a in ve.ACLs
from u in ve.Account
from gj in ve.ObjectGroupJoin
where u.username == currUsername // The username
&& (a.Account.id == u.id // The ACLs
&& a.objType == (int)ObjectType.Group)
&& (gj.ObjectGroup.id == a.objId // The groups
&& gj.objId == p.id) // The properties
select p;
查询返回正确的属性列表,并在大的工作正常。
但上面的linq查询中的“包含”调用不会加载对象。如果我在LINQ查询之后明确地调用“Load()”,那么这些对象将被加载。
related SO question提示“Include”调用和where子句之间可能存在冲突。这怎么可能?
但无论如何,我该如何重组这个查询来加载“phyAddress”和“Contract”成员?具体来说,我只想加载返回的对象的成员,而不是数据库中的所有“phyAddress”和“Contact”对象。
谢谢。
编辑
我从条款
这工作的问题追查到使用多个的...
IQueryable<Property> currPropList
= from p in ve.Property
.Include("phyAddress")
select p;
与 “phyAddress” 成员是加载。
但是,这并不工作...
IQueryable<Property> currPropList
= from p in ve.Property
.Include("phyAddress")
from a in ve.ACLs
select p;
基本上包括当有多个从条款调用将被忽略。有没有人知道这个工作?
编辑2
一种解决方法是投的IQueryable结果作为的ObjectQuery并得到包括过这一点。但我想阻止第二次往返数据库,我假设这会导致。
例如,这工作....
IQueryable<Property> currPropList
= ((from p in ve.Property
from a in ve.ACLs
select p) as ObjectQuery<Property>).Include("phyAddress");
有没有办法做到这一点只有一个单一的查询?
编辑3
没有第二个查询,因为延迟执行 [http://blogs.msdn.com/charlie/archive/2007/12/09/deferred-execution.aspx。所以编辑2将是解决方案。
它只做一个sql查询。没有第二次往返。如果你不确定,你应该看看SQL Server Profiler。 – LukLed 2009-12-12 23:59:03