2010-02-10 85 views
3

我對Linq相當陌生,並且在多對多關係中使用動態的方式掙扎着。Linq2Entities,多對多和動態where子句

數據庫表像這樣:

產品< - > Products_SubCategories < - >小類

Products_SubCategories是一個鏈接表。

我的全LINQ語句

db.Products.Where("it.SubCategories.SubCategoryID = 2") 
        .Include("SubCategories") 
        .OrderBy(searchOrderBy) 
        .Skip(currentPage * pageSize) 
        .Take(pageSize) 
        .ToList() 
        .ForEach(p => AddResultItem(items, p)); 

所以忽略一切扎Where()我只是想退出被鏈接到子類ID 2的所有產品,這將失敗,並

要從集合中提取屬性,必須使用子查詢遍歷集合中的多部分標識符第8行第1列。

我認爲使用SQL-esque語法可以按照this link做子查詢。但是我不確定如何在lambda/chaining語法中做到這一點。

這是一個搜索函數的開始,我想動態地創建where字符串,就像我使用searchOrderBy字符串來避免大的SELECT CASE一樣。產品通過鏈接錶鏈接到另一個表格,一旦我瞭解如何執行此示例,我將需要包含這些鏈接表格。

任何幫助將不勝感激!

感謝

回答

5

這是錯誤的:

db.Products.Where("it.SubCategories.SubCategoryID = 2") 

SubCategories是一個列表。它沒有名爲SubCategoryID的房產。相反,它包含一組實體,每個實體都有一個名爲SubCategoryID的屬性。這是一個關鍵的區別。

當您遇到不知如何進行的情況時,會遇到多種問題,最好將問題分解爲幾個較小的問題。

讓我們從刪除動態查詢開始。用非動態查詢解決問題會更容易。一旦你完成了這個任務,你可以回頭再次使其動態化。

因此,首先使用非動態語法。鍵入在Visual Studio這樣的事情,看看智能感知爲您提供:

db.Products.Where(p => p.SubCategories. 

你很快就會看到,沒有SubCategoryID財產。相反,你會看到一堆用於處理列表的LINQ API方法。如果你知道LINQ好,你將認識到,Any()方法是你想要的這裏:

db.Products.Where(p => p.SubCategories.Any(sc => sc.SubCategoryID == 2)) 

繼續運行該查詢。它工作嗎?如果是這樣,你可以前進到動態。我不是專家ESQL,但我會用線沿線的東西開始:

db.Products.Where("EXISTS(SELECT SC FROM it.SubCategories AS SC WHERE SC.SubCategoryID = 2"); 

順便說一句,我用MS動態查詢(「動態LINQ」)爲這樣的事情而不是查詢生成器,因爲它更容易測試。

+1

由於克雷格,明確的consisce和良好的工作。身份證支持自己進入一個角落!我通過SP整合了FT搜索功能,因此改變了實現方式,但這有助於我的理解。 – Jammin 2010-02-10 23:18:47

+0

優秀的答案,正是我所尋找的 – januszstabik 2010-11-19 13:53:08

0

它爲我工作。

db.Products.Where("SubCategories.Any(SubCategoryID = 2)")