代码之家  ›  专栏  ›  技术社区  ›  kervin

Linq、模拟连接和Include方法

  •  2
  • kervin  · 技术社区  · 15 年前

    Join and Include in Entity Framework

    基本上,下面的查询返回当前用户有权查看的“Property”对象列表。

    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;
    

    查询返回正确的属性列表,在很大程度上可以。

    这个 related SO question 建议“Include”调用和where子句之间可能存在冲突。怎么会这样?

    但无论如何,我如何重新构造此查询以加载“phyAddress”和“Contract”成员?具体来说,我只想把成员 返回

    谢谢。

    编辑

    条款

    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<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

    1 回复  |  直到 7 年前
        1
  •  4
  •   Imad Alazani Tahir Akhtar    11 年前

    这是一个已知的问题,包括。。。如果您执行了更改查询形状的操作(即从),则Include将丢失,不过有足够简单的解决方法:

    1. 可以将include包装在查询周围,请参见 Tip 22 - How to make include really include .
    2. 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的关系修复的副作用。