1

私はLINQに慣れてきており、ルックアップテーブルをオブジェクトに実装し、そのオブジェクト(またはその関連付け)を照会する基本的な概念とテクニックに固執しています。これはばかげた質問かもしれませんが、おそらく自分で解決すべきだったという答えがあるでしょう。しかし、私はまだこの方法を定着させた説明を見つけていません。

だから私はそのようなDB構造の例を作成しました

サンプル データベース

そして、2 つの LINQ クエリを実行したいと思います。1 つ目は、ルックアップを介して指定されたobject1に関連付けられているすべてのexample2レコードを提供し、2 つ目は、指定されたobject2に関連するすべてのexample1レコードを提供します。

誰かが私の頭脳を始動させてくれることを願っています。

何かのようなもの

var examples = (from e in db.examples where e.example2.id == id).ToList();

すばやく作成された SQL クエリ

SELECT * FROM [dbo].[example1] one
JOIN [dbo].[examplelookup] lu ON one.[id] = lu.[example1id]
JOIN [dbo].[example2] two ON lu.[example2id] = two.[id]
WHERE one.[id] = 1

切り取ってこれを作成しましたが、もう少し説明する必要があると思います

モデル

4

4 に答える 4

3

私はあなたが答えを受け入れたことを知っていますが、記録のためだけに:

これは、を使用する一般的なシナリオであり、SQLAny()に変換されます。特定の(で指定された)を参照するexists場合は、次のようにします。example1example2id

from ex1 in example1
where ex1.example2s.Any(e => e.id = id)
select ex1

これにより、example1オブジェクトの明確なリストが得られますが、を使用したソリューションでSelectManyは、重複したリストが生成される場合があります。

于 2012-08-15T13:13:50.297 に答える
2

仮定

example1-> examplelookup リレーション名は examplelookups です

example2-> examplelookup リレーション名は examplelookups です

examplelookup -> example1 リレーション名は example1

examplelookup -> example2 リレーション名は example2 です

与えられidた例1

db.example1.Where(x=>x.id == id).SelectMany(x=>x.examplelookups).Select(x=>x.example2);

とその逆

db.example2.Where(x=>x.id == id).SelectMany(x=>x.examplelookups).Select(x=>x.example1);

編集: any 句を使用するための Gert Arnold の提案された回答に基づく追加の更新 (これは、回答として既に受け入れられた後です)

db.example1.Where(x=>x.examplelookups.Any(y=>y.example2.id == id));

とその逆

db.example2.Where(x=>x.examplelookups.Any(y=>y.example1.id == id));

2回目の編集(すでに受け入れられて回答された後、データモデルを含めるように質問が変更された後)

db.Example1.Where(x=>x.Id == id).SelectMany(x=>x.Example2); // could have duplicates
db.Example2.Where(x=>x.Example1.Any(y=>y.Id == id)); //alternate any form removing the duplicates

とその逆

db.Example2.Where(x=>x.Id == id).SelectMany(x=>x.Example1); // could have duplicates
db.Example1.Where(x=>x.Example2.Any(y=>y.Id == id)); //alternate any form removing the duplicates
于 2012-08-15T12:50:05.500 に答える
0

非常に短い時間ですが、両方の関連付けを照会できるようにルックアップ テーブルから開始してみてください

var examples = (from el in db.examplelookup 
                where el.example2id == id
                select el.examples1.ToList();

ここでもコードチェックは行われません。

于 2012-08-15T12:50:45.730 に答える
0

あなたが探しているのは結合だと思います。このコードは、結合テーブルを介して、対応する example2 レコードを持つすべての example1 レコードを提供します。

var x = from ex1 in example1
        join exlookup in examplelookup on ex1.id equals exlookup.example1id
        join ex2 in example2 on exlookup.example2id equals ex2.id
        select ex1;

反対の ex2 レコードを取得するには、 に置き換えるだけselect ex1ですselect ex2

于 2012-08-15T12:39:57.750 に答える