あなたの直感が正しいか、それが最善の方法ではありません。 Entity Frameworkで多対多リレーションシップを正しく設定した場合、ジョイングテーブルT12
については言及する必要はありません。
Configure Many To Manyを参照してください。あなたのクラスに調整
:
class T1
{
public int Id {get; set;}
// every T1 has zero or more T2
public virtual ICollection<T2> T2s {get; set;}
// other properties
public int A {get; set;}
public string B {get; set;}
}
class T2
{
public int Id {get; set;}
// every T2 has zero or more T1
public virtual ICollection<T1> T1s {get; set;}
// other properties
public int C {get; set;}
public string D {get; set;}
}
public MyDbContext : DbContext
{
public DbSet<T1> T1s {get; set;}
public DbSet<T2> T2s {get; set;}
}
すべてです! Entityフレームワークは、T1とT2の間の多対多の関係をモデリングし、追加のデータベーステーブルを作成することを認識します。
linqクエリでは、この余分なテーブルは必要ありません。コレクションにアクセスすると、Linqによって結合が作成されます。
using (var myDbContext = new MyDbContext)
{
var result = myDbContext.T1s
.Where(t1 => t1.X == ...)
.Select(t1 = new
{
// select the T1 properties you want
A = t1.A,
B = t1.B,
// a T1 has zero or more T2s
// select the T2s you want:
T2s = t1.T2s
.Where(t2 => t2.Y == ....)
.Select(t2 => new
{ // Take the T2 properties you want
C = t2.C,
D = T2.D,
}),
});
}
ます。また、T2で開始することができ、 "私の財産Xは== ...プロパティY == ...彼のすべてのT2と、すべてのT1与える":
var result = myDbContext.T2s
.Where(t2 => t2.Y == ...)
.Select(t1 = new
{
// select the T1 properties you want
C = t2.C,
D = t2.C,
// a T2 has zero or more T1s
// select the T1s you want:
T1s = t2.T1s
.Where(t1 => t1.Y == ....)
.Select(t1 => new
{ // Take the T1 properties you want
A = t1.A,
B = T2.B,
}),
});
を
多対多のコレクションプロパティにアクセスするため、Entity Frameworkは、余分に作成された多対多テーブルとの結合を実行する必要があることを認識しています。
結果はGroupJoinに似ています。あなたはそれがグループ化されていない場合は、より本物のようなあなたはほとんど考える必要がない、あなたが適切にあなたの1対多および多対多の関係を定義するたびに、私の経験でSelectMany
var result = MyDbContext.T1s.SelectMany(t1 => t1.T2s
.Select(t2 => new
{
A = t1.A,
B = t1.B,
C = t2.C,
D = t2.D,
});
を、必要があります参加しますジョインでプロパティにアクセスするだけで、エンティティ・フレームワークは自動的に結合するテーブルを認識します。
'listIds'は順番にありますか?それ以外は 'OrderBy'を使います。 – aaron
EF 'IQueryable'で(カスタム) 'IEnumerable '拡張メソッドを使用しないでください。また、2つの照会の必要はありません。ナビゲーションプロパティを定義して使用します。そして、注文が問題であれば、 'OrderBy'を適用してください。' ORDER BY'節なしのSQLクエリの順序は未定義です。 –
編集を参照してください –