29

オブジェクト階層が与えられた場合

public class Parent
{
    public int Id { get; set; }
    public virtual Child Child { get; set; }
}

public class Child
{
    public int Id { get; set; }
    public virtual GrandChild GrandChild { get; set; }
}

public class GrandChild
{
    public int Id { get; set; }
}

およびDBコンテキスト

public class MyContext : DbContext
{
    public DbSet<Parent> Parents { get; set; }
}

次のように Lambda 構文 ( using System.Data.Entity)を使用して、子と孫を含めることができます。

using (MyContext ctx = new MyContext())
{
    var hierarchy = 
        from p in ctx.Parents.Include(p => p.Child.GrandChild) select p;
}

Lambda 構文は、クラス名が後で変更された場合にクエリが壊れないようにします。ただし、代わりに次のようなものParentがある場合:ICollection<Child>

public class Parent
{
    public int Id { get; set; }
    public virtual ICollection<Child> Children { get; set; }
}

ラムダ構文は機能しなくなりました。代わりに、文字列構文を使用できます。

var hierarchy = from p in ctx.Parents.Include("Children.GrandChild") select p;

文字列構文が唯一のオプションですか、またはこの状況で Lambda 構文を使用する別の方法はありますか?

4

2 に答える 2

40

確かに、あなたはすることができます

var hierarchy = from p in ctx.Parents
                    .Include(p => p.Children.Select(c => c.GrandChild))
                select p;

MSDN、キャプションの備考、5 番目の箇条書きを参照してください。

于 2013-02-10T22:30:35.547 に答える