使用Include获取集合内的属性

时间:2014-06-05 19:25:31

标签: entity-framework-6

我的模型有3个(相关)对象:

public class A
{
   public long Id {get;set;}
   public virtual long List<B> Bs {get; set;}
}

public class B
{
  public long Id {get;set;}
  public int Order {get;set;}
  public virtual C @C {get;set;}
}

public class C
{
  public long Id {get;set;}
  public sting Value {get;set;}
}

我正在尝试编写一个linq语句,该语句将从A开始,同时包括BC ...类似的东西(我知道这不起作用,但我不知道怎么表达一般的想法)

ctxt.A.Include(a=>a.Bs.C).ToList();

我试图生成的sql类似于:

SELECT
  *
FROM A

JOIN BtoA ba ON ba.Aid = A.Id

JOIN B ON ba.Bid = B.Id

JOIN C ON C.Id = B.Cid

怎么做?

编辑:

我的问题更多的是如何让EF在单个查询中提取数据,而不是如何获取数据本身。

2 个答案:

答案 0 :(得分:1)

可能会急切地加载多个级别的相关实体。

如果您的相关实体(C)属于集合(B),那么您需要在Select内写一个Include

ctxt.A.Include(a=>a.Bs.Select(b => b.C)).ToList();

另请参阅文档:Eagerly loading multiple levels

答案 1 :(得分:0)

我不确定你是使用db first还是代码优先方法,但在db中我会这样做:

  • 创建数据库视图

    创建视图MySchema.MyView AS
    选择   * 从A
    加入BtoA ba ON ba.Aid = A.Id
    加入ba.Bid = B.Id
    加入C.Id = B.Cid

  • 然后,在从db更新模型后,我会使用此视图来显示数据(这是我想你要做的)

实际上,在EF 6中的代码优先方法中,您还可以创建视图:

//Figure 8 Using the New CreateView Operation

public partial class AddView : DbMigration
  {
    public override void Up()
    {
      this.CreateView("MySchema.MyView",
                      @"SELECT *
                        FROM A
                        JOIN BtoA ba ON ba.Aid = A.Id    
                        JOIN B ON ba.Bid = B.Id    
                        JOIN C ON C.Id = B.Cid");
    }
    public override void Down()
    {
      this.RemoveView("dbo.CasinosWithOver100SlotMachines");
    }
  }

如此处所述(图8): http://msdn.microsoft.com/en-us/magazine/dn519921.aspx