2017-10-30 24 views
0

SeriesオブジェクトにはSkusというプロパティがあり、IEnumerableです このskuがskusの許可リストにある場合は、そのシリーズが必要です。コレクションのLinq結合コレクション

下の例では、正しくないs.SeriesIdに参加しています。 私はそれがコレクションである必要があると信じています.Skus コレクションにskuが含まれているシリーズを返すだけです。

 IEnumerable<Data.Models.Series> series = await _seriesRepository.GetSeriesAsync(Properties.Settings.Default.Channel, page, limit); 
     string[] skusInSeries = series?.SelectMany(x => x.Skus).Distinct().ToArray(); 

     IEnumerable<string> itemNumbers = GetAllowedSkus(Customer, Shipto, EnvironmentCode, AcceptLanguage, skusInSeries, Warehouse); 


     var selected = from s in series 
         join i in itemNumbers 
         on s.SeriesId equals i  //s.Skus IEnumerable<string> 
         select s; 

答えて

1
var selected = from s in series 
       where itemNumbers.Any(i => s.Skus.Contains(i)) 
       select s; 

またはその他の方法:

var selected = from s in series 
       where s.Skus.Any(sku => itemNumbers.Contains(sku)) 
       select s; 

私は推測していますが、通常よりSkusよりitemNumbersがあるとの最初の選択肢が良いです。また、データベースに渡すことができるリストにitemNumbersを変更した方がよい場合があります。

var itemNumbers = GetAllowedSkus(Customer, Shipto, EnvironmentCode, AcceptLanguage, skusInSeries, Warehouse).ToList(); 
var selected = from s in series 
       where itemNumbers.Any(i => s.Skus.Contains(i)) 
       select s; 

SQL(または他の)データベースが関与していない場合は、効率的な検索のためHashSetitemNumbersを変換します。

var itemNumbers = new HashSet<string>(GetAllowedSkus(Customer, Shipto, EnvironmentCode, AcceptLanguage, skusInSeries, Warehouse)); 

var selected = from s in series 
       where s.Skus.Any(sku => itemNumbers.Contains(sku)) 
       select s; 
+0

ありがとうございます。それがそれでした。私は、あなたのソリューションをHashSetに関連づけました。データベースは使用されません。私はHashSetを見て、それについてもっと学びます。 – user3582849

関連する問題