1

次の (簡略化された) クラスが与えられます。

public class Master
{
    public int Id { get; set; }
    public string UniqueName { get; set; }
    public virtual List<Detail> Details { get; set; }
}

public class Detail
{
    public int Id { get; set; }
    public string UniqueCode { get; set; }
}

Linq to Entities を使用して、Master の UniqueName と Detail の UniqueCode を指定して、特定の Detail インスタンスを選択するにはどうすればよいですか?

Detail から Master へのナビゲーション プロパティがないことに注意してください。

ナビゲーション プロパティがあれば、次のようなことができると思います。

Detail detail = (from m in ctx.Master.Include(p=>p.Details)
                 join d in ctx.Details
                 on m.Id = d.MasterId
                 where m.UniqueName == "Something" && d.UniqueCode == "Else"
                 select d).SingleOrDefault();

Detail から Master へのそのナビゲーション プロパティがなければ、最初にその Master のすべての Detail インスタンスを含む Master をフェッチし、次に Detail インスタンスを反復せずに続行する方法がわかりません。特定のマスターに多数の Detail インスタンスがある場合、これは非常に非効率的です。

4

2 に答える 2

0

オブジェクトに対してlinqを使用しているのか、エンティティに対してlinqを使用しているのかは完全にはわかりません。クラスのみが関与している場合は、次のクエリを試してください。

    var mst = new List<Master> { 
        new Master { Id = 1, UniqueName = "Something", Details = new List<Detail> { 
            new Detail { Id = 10, UniqueCode = "Else" }, new Detail { Id = 11, UniqueCode = "det1" }} 
        } ,
        new Master { Id = 2, UniqueName = "mast2", Details = new List<Detail> { new Detail { Id = 20, UniqueCode = "det2" } } } 
    };

    var detail = (from d in
                        ((from m in mst
                            where m.UniqueName == "Something"
                            select m.Details).SingleOrDefault())
                where d.UniqueCode == "Else"
                select d).SingleOrDefault();

データテーブルがある場合、詳細テーブルにはおそらく MasterID (int) 列があるため、次のクエリを試してみます。

    var detail = (from d in ctx.Detail
                    where d.MasterID == (
                        (from m in ctx.Master
                         where m.UniqueName == "Something"
                         select m.Id).SingleOrDefault())
                    && d.UniqueCode == "Else"
                    select d).SingleOrDefault();
于 2012-09-13T11:44:51.423 に答える
0

試す

var detail = ctx.Master.Where(m => m.UniqueName == "Something")
    .Select(m => m.Details.Where(d => d.UniqueCode == "Else").FirstOrDefault())
    .SingleOrDefault();
于 2012-09-11T05:40:35.277 に答える