2016-11-15 56 views
1

我有2個表,Category和ProductToCategory。在實體框架中使用「IN」

類別具有所有類別的名稱,而ProductToCategory具有分配給產品的所有類別的列表。它是分開的,因爲1個產品可以有多個類別。

我是新來的實體框架,並試圖獲得分配給特定產品的類別列表。我需要從類別表中返回信息,但ProductToCategory是我搜索的內容以獲取分配的內容。

我想要獲得所有類別的ID分配給ProductTOCategory表中的特定產品ID。

在SQL我會鍵入:

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'(...)。包含(x)',你可以嘗試在LINQ中輸入你的SQL查詢。 –

回答

1

可以使用join代替IN這裏。

希望您在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, ... };