1

私は 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();

これにより、タグのない製品を含め、すべての製品とそれぞれのタグが取得されます。うまくいけば、それは正しい理由で機能します...

4

1 に答える 1

0

EF のようなオブジェクト リレーショナル マッパーを使用する目的は、リレーションシップをマップすることです。データベースに外部キーを持つオブジェクトを手動で結合している場合、それは間違っています。

私の質問を参照してください単純な一対多の関係でLINQ Joinを使用するのはなぜですか?

正解は単に ですcontext.Products.Include("Tags")。これにより、製品とタグが自動的に魔法のように結合されます。これは文字通り、ORM を使用する最大の (唯一の?) 利点です。

于 2012-04-04T05:29:11.353 に答える