1

私は多対多の関係 (この例では "Left" "Right" と "Joinder") と "Left" にキーを設定する別のエンティティ "Satellite" を持っています。たまたま、Sattelite の FK にも固有のインデックスがあります。私の目標は、WHERE 句のサテライトのプロパティを使用して、1 つの Joinder エンティティをその Left エンティティと Right エンティティと共にロードすることです。

私は多くのアプローチを試みましたが、Linq のボキャブラリーは弱く、探しているものの用語さえ本当に知りません。

var joinder = dbContext.Joinders
                .Include(j => j.Left)
                .Include(j => j.Right)
                .Include(j => j.Left.Satellites)
                .FirstOrDefault(s => s.Name == "Hubble");

FirstOrDefault 句には、名前を分析するための s のコンテキストがないため、これは機能しません。

var joinder = dbContext.Joinders
                .Include(j => j.Left)
                .Include(j => j.Right)
                .Include(j => j.Left.Satellites)
                .Select(j => j.Left.Satellites)
                .Where(s => s.Name == "Hubble");

IQueryable<Collection<Satellite>>Select から出てくる型が混乱しているため、これは機能しません。

var query = from j in dbContext.Joinders
    join l in dbContext.Lefts on j.LeftId equals l.Id
    join r in dbContext.Rights on j.RightId equals r.Id
    join s in dbContext.Satellites on l.Id equals s.LeftId
    where s.Name == "Hubble"
    select j;

このクエリはコンパイルおよび実行されますが、完全に脱水されたオブジェクトが返されます。返された Joinder 参照には、Left プロパティと Right プロパティの両方が null があります。

var query = from j in dbContext.Joinders
    join l in dbContext.Lefts on j.LeftId equals l.Id
    join r in dbContext.Rights on j.RightId equals r.Id
    join s in dbContext.Satellites on l.Id equals s.LeftId
    where s.Name == "Hubble"
    select new Joinder
    {
        Left = l,
        Right = r,
        Left.Satellites = ...?
    };

自動初期化子内でこれらのプロパティ名を逆参照できないように見えるため、これは機能していないようです。

誰でもこれを行う方法を知っていますか? 本質的には、「エンティティ フレームワークの多対多のディープ ロード」を検索したいのですが、他の誰もが私のように言葉で表現するわけではないと思います。

4

2 に答える 2

0

これを試して

var joinders = dbContext.Joinders
                        .Include(j => j.Left)
                        .Include(j => j.Right)
                        .Include(j => j.Left.Satellites)
                        .Where(j => j.Left.Satellites.Any(s => s.Name == "Hubble");

これにより、「Left」にリンクされたサテライトのいずれかが「Hubble」という名前を持つすべてのジョインダーが返されます。Left と Right が熱心に読み込まれることはわかっていますが、Satellite についてはわかりません。

于 2013-10-05T11:42:14.547 に答える