我的模型有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
开始,同时包括B
和C
...类似的东西(我知道这不起作用,但我不知道怎么表达一般的想法)
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在单个查询中提取数据,而不是如何获取数据本身。
答案 0 :(得分:1)
可能会急切地加载多个级别的相关实体。
如果您的相关实体(C
)属于集合(B
),那么您需要在Select
内写一个Include
:
ctxt.A.Include(a=>a.Bs.Select(b => b.C)).ToList();
答案 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