2013-07-02 22 views
1

我有兩個主表ListingsPlace。在列表中有一個字段PlaceId,它反映了Place實體/行/對象。我想在兩個表上查詢,這樣我就能像這樣得到他們兩個。在lambda表達式中應用多重標準c#

var query = context.Listings 
     .Include("Place") 
     .Where(l => l.Place.TypeId == Type.Ro) 
     .OrderBy(l => l.Id).ToList(); 

在此之後,現在我想對此查詢進行一些篩選,這裏是條件。

我只有這樣的字符串var filter = "1,2,4";。現在我想過濾列表,以獲取所有這些列表,其中臥室等於1或2或4。

我做了什麼

string minBeds = "1,2,4"; 

foreach (var item in minBeds.Split(',')) 
{ 
     int minBed = int.Parse(item); 
     query = query.Where(l=>l.Place.Bedroom == minBed).ToList(); 
} 

但是這樣做,這是給我的結果爲零。

回答

6

您過濾它的方式的問題。第一遍之後,您將過濾掉除Bedroom == 1之外的所有內容,在第二次過濾中,除了Bedroom == 2之外的所有內容,但由於列表中只有項目爲Bedroom == 1,因此結果集中不會包含任何內容。

的解決方案是使用傳統的C#||操作:

query = query.Where(l => l.Place.Bedroom == "1" || 
         l.Place.Bedroom == "2" || 
         l.Place.Bedroom == "4"); 

或者,如果你想成爲更靈活,使用Contains方法:

string[] minBeds = "1,2,4".Split(','); 
query = query.Where(l => minBeds.Contains(l.Place.Bedroom)); 

注意如果Bedroom是一個整數,您需要首先將輸入轉換爲適當的類型:

var minBeds = "1,2,4".Split(',').Select(int.Parse); 
query = query.Where(l => minBeds.Contains(l.Place.Bedroom)); 

另請注意,我已在此處取消ToList。除非您需要需要通過索引訪問項目並且從結果集合中添加/刪除項目,否則很可能只是浪費資源。通常你可以依靠Linq的本地懶惰來延遲處理來查詢,直到你真的需要結果。

+0

過濾器字符串不是靜態的,它可能來自'1-4'。它可能是'1,3'' 1,4,2'或任何東西 – Ancient

+0

@ user2413182看到我的更新 –

+0

真棒,非常感謝 – Ancient