2016-06-20 16 views
2

単語の配列にループを実行して、項目に特定の単語が含まれている場合とそうでない場合があります。私はどのように絶対にクエリに含まれてループする知っているが、私はそれをしたくない。ここに私のコードは次のとおりです。OR foreach looped linqラムダ式

C#

var item = "the-batman-returns-hd-version"; 
var id = 0; 
     //split slug by dash into an array 
     var keywords = item.Split('-'); //gives me (the, batman, returns, hd, version) 


     //remove any work less than 4 chracters 
     var result = _contentService.Products; 
     foreach (var word in keywords) 
     { 
      if (word.Length <= 4) continue; 
      var key = word; 
      result = result.Where(c => c.Title.Contains(key)); 
     } 

     var firstOrDefault = result.FirstOrDefault(); 
     if (firstOrDefault != null) 
     { 
      id = firstOrDefault.Id; 
     } 

     //loop query to search where all parts exist 

     return (id); 

上記作品。しかし、この製品は「バットマンリターン」と呼ばれているので、「hd」と「バージョン」を含むアイテムが見つからないため、0を返します。

とにかく、ループされたlinqにORがあります。以下のような:

foreach (var word in keywords) 
     { 
      if (word.Length <= 4) continue; 
      var key = word; 
      result = result.Where(c => c.Title.Contains(key) ||); //or; then loop again. 
     } 
+0

SQLでフィルタリングを実行したい場合は、それらの条件を 'OR'句のセットに「連結」する式ツリーを構築する必要があることに注意してください。 –

答えて

4

あなたは.Any()メソッドを使用することができます

result = result.Where(c => keywords.Any(k => c.Title.Contains(k))); 

あなたが望むかもしれないと思われるようにあなたは、さらに5文字以上の言葉少ないをフィルタリングすることができます。それが、

result = result.Where(c => keywords.Where(k => k.Length > 4).Any(k => c.Title.Contains(k))); 

をキーワード配列の作成時に一度それを行う方が効率的です:

var keywords = item.Split('-').Where(k => k.Length > 4).ToArray();