LINQ - 使用包含的子句

时间:2016-05-27 18:04:42

标签: c# linq

我有一个LINQ语句,我需要做一个“包含”,但也需要某种循环。

数据格式如下:

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

当用户从列表中选择多个项目进行搜索时。

我需要在Product_Name内找到从用户中选择的任何内容。

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

此行获取用户从列表中选择的项目,并将它们存储在数组中。

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

不起作用,因为Product_Name是产品的扁平版本,所以我不能这样做。

我需要的是以下内容:

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

但是当为上面的内容创建SQL时,它使用AND条件而不是OR条件。我需要找到string s中包含Product_Name的任何实例。

1 个答案:

答案 0 :(得分: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是您的实体名称