2016-05-27 3 views
0

私はLINQステートメントを持っていますが、 "contains"を実行する必要がありますが、何らかのループが必要です。ユーザーが検索するリストから複数の項目を選択LINQ - Contains using Contains

x.Product_Name = "product[x], product[y], product[z]" 

として次のよう

データの形式です。

私はProduct_Nameの中からユーザーから選択したものを見つける必要があります。

var names = JsonConvert.DeserializeObject<IEnumerable<string>> 
(criteria.value).ToArray(); 

この行は商品をリストから選択したユーザーを取得し、配列に格納します。 Product_Nameは、製品の平らバージョンですので、私はこれを行うことはできませんので

query = query.Where(x => names.contains(x.Product_Name)) 

は動作しません。私は必要なもの

は、次のようなものです:

foreach (string s in names) 
{ 
    projectsQuery = projectsQuery.Where(x => x.Product_Name.Contains(s)); 
} 

しかし、SQLは、上記のために作成されたとき、それは代わりに、条件付きORAND条件を使用しています。 string sProduct_Nameに含まれているインスタンスを見つける必要があります。

+5

であるあなたは、 '()は、x => names.Any(S => x.Product_Name.Contains(S))'どこを探していますか? – juharr

+0

@juharr。それは私が望んでいたようだ。少しテストしますが、最初のテストは今のところ良いです – Kocheese

答えて

0

これは、手動で式ツリーを作成することで実現できます。コードを管理するのは難しいですが。ここ

var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 

var xParameter = Expression.Parameter(typeof(x), "x"); 

var searchexpression = new stack<expression>();           
foreach (string s in names) 
{ 
    var containsmethodexp = expression.call(Expression.Property(xParameter, "Product_Name", containsMethod, expression.constant(s)); 
    if (searchexpression.count == 0) 
    { 
     searchexpression.push(containsmethodexp); 
    } 
    else 
    { 
     searchexpression.push(expression.orelse(containsmethodexp, searchexpression.pop())); 
    } 
} 

var finalResult = projectsQuery.Where(Expression.Lambda<Func<x, bool>>(searchexpression.pop(), new ParameterExpression[] { xParameter })); 

xはあなたのエンティティ名

+0

@kocheese ...いくつかのタイプミスのコードを更新しました。 –