私は TSQL + C# の土地から来て、linq と EF に適応しようとしています。多対多の関係は私をつまずかせてきました。データベースから照会したい多対多の関係を持つモデルがあります。そのような:
class Product{
public int ID {get;set;}
public string ProductName {get;set;}
public virtual ICollection<Tag> Tags {get;set;}
}
class Tag {
public int ID {get;set;}
public string TagName {get;set;}
public virtual ICollection<Product> Products {get;set;}
}
製品自体を DbContext から取得し、後で次のように関連するタグを取得できます。
// product exists in memory as a Product with an empty product.Tags
var query = from p in db.Product
from t in db.Tags
where p.ID == product.ID
select p.Tags;
次に、取得したタグを使用して product.Tags を割り当てることができます。明らかに、すべての製品を照会する必要がある場合、複数の製品を扱う場合、これは非常に非効率的です。
linq と EF を使用して、関連するすべてのタグを含む製品をデータベースへの 1 回の往復で取得できるようにしたいと考えています。また、すべての製品とそれに関連付けられたタグ (またはフィルター処理された製品のリスト) を取得できるようにしたいと考えています。linq はどのように見えますか?
編集:
わかりました、もう少しいじった後、私はこれを手に入れました:
var query = db.Product.Include("Tags")
.Where(p => p.Tags.Any(t => t.Products.Select(m => m.ID).Contains(p.ID)));
これはほとんど私が必要とするものです。結果はすべてタグ付きの商品です。タグのない商品は欠品です。これは、SQL の内部結合に相当すると考えています。タグを商品に外付けのままにして、タグ付きの商品はすべて返品したいです。タグのない製品を除外せずに、関連付けられたタグを持つすべての製品を取得する方法は?
編集:
これは思ったより簡単でした。
var query2 = db.Product.Include("Tags").DefaultIfEmpty();
これにより、タグのない製品を含め、すべての製品とそれぞれのタグが取得されます。うまくいけば、それは正しい理由で機能します...