1

1-0..1 の関係を持つ A と B の 2 つのテーブルがあるとします。私はアダプターアプローチを使用します。A エンティティのコレクションを 1 か所にロードしてから、関連するすべての B エンティティを後ですべての A エンティティにロードする必要があります。Prefetch を使用しない理由は、ほとんどの場合、B エンティティをロードする必要がないからです。

どこでもLINQを使っているので、同じようにしたいと思います。

私が書こうとしているコードは次のようになります。

var linqMetadata = new LinqMetaData(adapter)
{
    ContextToUse = new Context()
};

var aCollection = linqMetadata.A.Where(/*some filter*/).ToList();

// ...

var bIds = aCollection.Select(x => x.BId);
var bCollection = linqMetadata.B.Where(x => bIds.Contains(x.BId)).ToList();

問題は、リンクされbCollectionていないaCollectionままであるということです。つまり、すべてのAエンティティがリンクされていてB = null、その逆もあります。これらの参照を設定したいので、2 つのグラフを 1 つのグラフに統合します。

LINQ to Objects を使用して 2 つのコレクションを結合できますが、それはエレガントではありません。さらに、両方のコレクションに相互接続を確立する必要がある複雑なグラフが含まれている場合、これははるかに複雑になる可能性があります。

B から A へのプリフェッチを記述できますが、これは完全に不要な 1 つの余分な DB クエリです。

これらの 2 つのグラフをマージする簡単な方法はありますか?

4

2 に答える 2

1

マスター エンティティの割り当てと詳細エンティティの AddRange を使用して関連エンティティを追加すると、オブジェクト関係グラフが自動的に構築されます。

疑似コードのサンプルを次に示します。

foreach aEntity in aCollection
   aEntity.BEntity = bCollection.First(x=>x.Id == aEntity.bId);

OR

foreach bEntity in bCollection
   bEntity.AEntity.AddRange(aCollection.Where(x=>x.bId == bEntity.Id));

これを行うと、オブジェクト グラフが完成します。

于 2014-09-16T08:05:09.830 に答える
0

既に Context を使用しているため、PrefetchPath と contextを使用して後で PrefetchPath をロードできます。これにより、エンティティは常にリンクされます。次に、Linq2Objects クエリを実行して、すべての B をメモリ内にロードできます。

var bs = aCollection.Select(x => x.B).ToList();
于 2014-09-09T15:51:51.290 に答える