2016-11-15 8 views
1

カテゴリとProductToCategoryの2つのテーブルがあります。エンティティフレームワークで "IN"を使用する

カテゴリにはすべてのカテゴリの名前があり、ProductToCategoryには製品に割り当てられているすべてのカテゴリのリストがあります。 1つの製品が複数のカテゴリを持つことができるため、分離されています。

私はエンティティフレームワークに新しく、特定の製品に割り当てられたカテゴリのリストを取得しようとしています。 Categoryテーブルから情報を返す必要がありますが、ProductToCategoryは、割り当てられたものを取得するために検索する場所です。

ProductTOCategoryテーブルのカテゴリIDが特定の製品IDに割り当てられているすべてのカテゴリを取得しようとしています。 SQLで

私のように入力します。あなたがここにjoinの代わりINを使用することができます

SELECT (Category Fields) FROM Category WHERE Category.Id 
IN (SELECT ProductToCategory.CategoryId FROM ProductToCategory 
WHERE ProductId = (THE PRODUCT ID)) 

か、その

+1

すべては、モデルの定義方法によって異なります。正しく定義されたナビゲーションプロパティでは、 'Products.Find(10).Categories'と同じくらい簡単になります。それで、データベースへの2回の呼び出しで終わるかもしれないので、 'Categories.Where(c => c.Products.Select(p => p.ProductId).Contains(10))' – MarcinJuraszek

+0

まず、定数値のコレクションが必要です。次に、 'Where(x => list.Contains(x))'を使って 'IN'節を生成します。 –

+1

SQLの 'x in(...)'がLINQ '(...)。Contains(x)'に変換されることを知っていれば、SQLクエリをLINQに入力することができます。 –

答えて

1

のようなものを。

は、以下に示すように、あなたがそれを行うことができ.ThenあなたはCategoryProductToCategoryの間にナビゲーションプロパティを持っている願っています。

var query = 
    from t1 in context.Category 
    where t1.ProductToCategory.ProductId == "THE-PRODUCT-ID" 
    select new { t1.Col1, t1.Col2, ... }; 

お持ちでない場合は、次のようにjoinを使用してください。

var query = 
    from t1 in context.Category 
    join t2 in context.ProductToCategory 
     on t1.Id equals t2.CategoryId 
    where t2.ProductId == "THE-PRODUCT-ID" 
    select new { t1.Col1, t1.Col2, ... }; 
関連する問題