2014-02-13 88 views
1

我總結了我的問題,在以下c#代碼片段中。我通過review.we過濾酒店。我們從用戶查看用戶在逗號分隔值from.Currently我循環瀏覽用戶評論並將每個結果合併爲單個結果。 現在,我想將循環和linq查詢寫入單個linq查詢中。結合foreach循環和linq查詢到單個linq查詢

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace LinqST 
{ 
    public class Hotel 
    { 

     public string Name { get; set; } 
     public int Review { get; set; } 

    } 
    public class DAL 
    { 
     public static List<Hotel> Get() 
     { 
      return new List<Hotel>() 
      { 
       new Hotel{Name="Hotel1",Review=4}, 
       new Hotel{Name="Hotel2",Review=2}, 
       new Hotel{Name="Hotel3",Review=2}, 
       new Hotel{Name="Hotel4",Review=3}, 
       new Hotel{Name="Hotel5",Review=5}, 
       new Hotel{Name="Hotel6",Review=5}, 
       new Hotel{Name="Hotel61",Review=4}, 
       new Hotel{Name="Hotel6",Review=4} 
      }; 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var filterHotel = "3,4"; 
      var tempList = new List<Hotel>(); 
      foreach (var item in Array.ConvertAll(filterHotel.Split(','), s => int.Parse(s))) 
      { 
       var list = DAL.Get().Where(x => x.Review == item); 
       tempList = tempList.Union(list).ToList(); 
      } 
     } 
    } 
} 

回答

3

這聽起來像你已經有了一個連接,基本上是:

var ratings = filterHotel.Split(',').Select(text => int.Parse(text)).Distinct(); 
var list = DAL.Get() 
       .Join(ratings, hotel => hotel.Review, rating => rating, 
        (hotel, rating) => hotel) 
       .ToList(); 

編輯:按照要求,如果有一個說法是更有價值你比可讀性:

var list = DAL.Get() 
       .Join(filterHotel.Split(',').Select(text => int.Parse(text)).Distinct(), 
        hotel => hotel.Review, 
        rating => rating, 
        (hotel, rating) => hotel) 
       .ToList(); 

或者作爲查詢表達式:

var list = (from hotel in DAL.Get() 
      join rating in filterHotel.Split(',') 
             .Select(text => int.Parse(text)) 
             .Distinct() 
      on hotel.review equals rating 
      select hotel).ToList(); 
+0

感謝您的答案。我可以將這兩個查詢結合到單個linq查詢中 –

+1

@geek:您可以*在一個語句中做到這一點,但有什麼好處?我會補充說,作爲一個選項,但我不認爲這是一個好主意。 –

+0

我一直在尋找像解決方案的查詢表達式:) –

4

嘗試使用Contains

var filteredIds = Array.ConvertAll(filterHotel.Split(','), int.Parse); // or filterHotel.Split(',').Select(int.Parse); 
var list = DAL.Get().Where(x => filteredIds.Contains(x.Review)); 
+0

我可以使用或條件contains方法 –

+0

@geek我不確定你在問什麼。 –

+0

我的意思是,如果評論是4,那麼我會過濾所有的評論4和4.5之間的酒店。 –

2

您可以使用此:

結果由ReSharper的
tempList = Array.ConvertAll(filterHotel.Split(','), int.Parse) 
       .Select(item => DAL.Get().Where(x => x.Review == item)) 
       .Aggregate(tempList, (current, list) => current.Union(list).ToList()); 

+0

得到重複結果 –