2010-04-19 37 views
1

我有一個很好的情況,我認爲在開始這個通常的查詢,但我有一些問題,試圖解決這個問題,情況是:使用屬於另一個列表的屬性過濾對象的列表。使用linq

我有一個「房屋」的列表,每個房子都有一個「Windows」列表。我要篩選目錄僅兩院女巫有一個藍色窗口,所以我家的擴展方法是這樣的:

public static List<House> FilterByWindow (this IEnumerable<House> houses, Window blueOne){ 

    var list = houses.Select(p=>p.Windows.Where(q=>q.Color == blueOne.Color)); 
    return list.ToList(); 
} 

這是正確的還是我失去的東西嗎?一些更好的建議?

回答

2

如果你想搜索包含藍色WindowsHouse實例,然後利用現有的Any擴展:

var blueWindowHouses = 
    from h in houses 
    where h.Windows.Any(w => w.Color == blueOne.Color) 
    select h; 

你現在所擁有的是什麼正確。 Select擴展不會過濾 - 它是一個投影,並且不會將結果分配給任何內容,因此您擁有的行實際上是無操作的。

此外,通過將此邏輯封裝在方法中,可以防止表達式編譯器能夠將其轉換爲SQL語句。相反,按照上面的說明將它全部寫入,或者接受並返回IQueryable<House>而不是接受IEnumerable<House>並返回List<House>

+0

這個解決方案工作的很好,但現在我意識到我有另一個業務需求。我的最終名單必須只有藍色的窗戶,有一些簡單的linq解決方案嗎? – Custodio 2010-04-20 13:33:18

2
return houses.Where(house => house.Windows.Any(window => window.Color == blue)) 
      .ToList(); 
+0

這將返回一個'List ' – Lee 2010-04-19 21:17:17

+0

'Select'和'Where'在我的鍵盤上彼此相鄰。我總是把它們混在一起。 – dtb 2010-04-19 21:18:51

+1

你有'Select'和'Where'的專用鍵嗎?我在哪裏可以得到這些鍵盤之一? – Aaronaught 2010-04-19 21:32:35

相關問題