2009-12-12 30 views
2

我期待成是关系到一个问题... 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将是解决方案。

+0

它只做一个sql查询。没有第二次往返。如果你不确定,你应该看看SQL Server Profiler。 – LukLed 2009-12-12 23:59:03

回答

4

这是包含...的一个已知问题,如果您执行某些更改查询形状的操作(即,从)然后包含丢失有简单的解决方法,虽然:

  1. 你可以包装围绕查询,请参阅Tip 22 - How to make include really include
  2. 或者您可以在select子句中获得所需的一切,让关系修复工作为您完成工作。即

    var x = from p in ve.Property 
         from a in ve.ACLs 
         select new {p,p.phyAddress}; 
    
    var results = x.AsEnumerable().Select(p => p.p); 
    

查阅结果是属性实体的枚举,但每一个都有它phyAddress加载,对于phyAddress初始请求的副作用,和EF的关系修正。