次のテーブルがあります
Clubs
- Id
- Name
Members
- Id
- ClubId linked to Clubs.Id
- Name
メンバーがいないクラブのリストを取得するクエリを LINQ で作成するにはどうすればよいですか?
PS: ここでの正しい用語は何ですか? members テーブルは、Clubs テーブルの * です。(親子じゃないけど?)
次のテーブルがあります
Clubs
- Id
- Name
Members
- Id
- ClubId linked to Clubs.Id
- Name
メンバーがいないクラブのリストを取得するクエリを LINQ で作成するにはどうすればよいですか?
PS: ここでの正しい用語は何ですか? members テーブルは、Clubs テーブルの * です。(親子じゃないけど?)
メンバーがいないクラブのリストを取得するクエリを LINQ で作成するにはどうすればよいですか?
あなたはこれを行うことができます:
from m in db.Members
where !db.Clubs.Any( c => (c.Id == m.ClubId))
select m;
2 番目の質問:
ここで正しい用語を使用する必要がありますか? members テーブルは、Clubs テーブルの * です。(親子じゃないけど?)
いいえそうではありません。メンバーはクラブなしで存在できるため、これは親子関係ではありません。Members
あなたの場合のとの関係Clubs
は、UML で呼ばれるものAggregationです。しかし、親と子の関係、または彼らがCompositionと呼んだもの、つまり関係があります。子オブジェクトは親なしでは存在できません。そして、それはあなたの場合ではありません。
これにより、メンバーのいないクラブのリストが表示されます。
from c in db.Clubs
where !db.Members.Any( m => m.ClubId == c.Id)
select c;
しかし、これを行う正しい方法は、中間テーブルとの多対多の関係になると思います。(あなたのデータは例外かもしれませんか?)あなたが3つのクラブに所属している場合、あなたはメンバーテーブルに3回あなたの記録を持っていますか?ClubIdがMembersテーブルにあるかどうかを確認する必要があります。アドレスの変更は、3つのレコードに対して行う必要があります。これは正しい方法ではありません。
したがって、MembersテーブルからClubIdを削除し、MemberIdとClubIdのみを含むテーブルMembers_Clubsを追加すると、1つのメンバーを多くのクラブに関連付けることができます。
その場合、ステートメントは次のようになります。
from c in db.Clubs
where !db.Members_Clubs.Any( mc => mc.ClubId == c.Id)
select c;
この場合、どちらのエンティティも「親」でも「子」でもありません。これにより、それらは連想エンティティになります。