2011-02-24 77 views
3

我有一個多對多的表結構稱爲PropertyPets。它包含一個由PropertyID(來自Property表)和一個或多個PetID(來自Pet表)的雙主鍵組成。LINQ多對多有或包含子句(和一個扭曲)

接下來我有一個搜索屏幕,人們可以從jquery multiple select下拉選擇多個寵物。比方說,有人選擇狗和貓。

現在,我希望能夠返回在多對多表格PropertyPets中包含兩個狗和貓的所有屬性。我試圖用Linq to Sql來做到這一點。

我已經看過了包含子句,但它似乎並沒有對我的要求工作:

var result = properties.Where(p => search.PetType.Contains(p.PropertyPets)); 

這裏,search.PetType是的ID,用於狗和貓的int []數組(在多選下拉菜單中選擇)。問題首先,Contains需要一個字符串,而不是類型爲PropertyPet的IEnumerable。其次,我需要找到既有狗又有貓的特性,而不僅僅是包含一個或另一個。

謝謝你的任何指針。

回答

5

您可以使用嵌套的where子句執行此操作。

您需要使用contains篩選p.PropertyPets - 返回PetID所在的所有行search.PetType

那麼只有從properties返回行的所有搜索的ID已被發現 - 例如number of rows >= number of serach id's

一起:

var result = from p in properties 
      where p.PropertyPets.Where(c => search.PetType.Contains(c.PetID)).Count() >= search.PetType.Count() 
      select p; 
+0

傑夫 - 它的作品!謝謝。非常簡潔,看起來非常有創意,可以啓動。 – Chris 2011-02-24 16:57:16

+0

@Chris - 沒問題。樂於幫助 :) – 2011-02-24 18:01:43

0

對於那些Contains需要string不會是真​​實的一部分,Contains應該需要一個int如果你search.PetTypeint[]。這意味着您需要將p.PropertyPets「轉換」爲int。要將p.PropertyPets轉換爲IEnumerable<int>,您需要選擇PropertyID字段:p.PropertyPets.Select(propertyPet => propertyPet.PropertyID),但這並不會根據需要爲您提供單個int,而是包含一大堆。 (.First()會給你一個INT卻解決不了你的問題。

你真正想要做的是

var result = properties.Where(p => 
    search.PetType.Except(p.PropertyPets.Select(propertyPet => 
          propertyPet.PropertyID)).Count() == 0); 

Except不LINQ2SQL用。

我能找到的最好的辦法是在search.PetType申請Contains每個項目

事情是這樣的:

var result = properties; 
foreach(var petType in search.PetType) 
{ 
    result = from p in result 
      where p.PropertyPets.Select(propertyPet => 
        propertyPet.PropertyID).Contains(petType) 
      select p; 
} 
+0

Albin-這並沒有爲我工作。從概念上來說,它似乎是應該的。在編譯器抱怨的時候,我在最後添加了一個'Select p',但仍然沒有結束。即使我選擇了屬性確實有的寵物,結果也沒有屬性。 – Chris 2011-02-24 16:51:29