使用Linq在WHERE子句中构建OR表达式

时间:2018-10-23 07:50:35

标签: c# linq

我需要创建一个包含WHERE表达式的OR子句的SQL Linq。其操作数存储在List中。

通过这段代码,我最终得到一个AND表达式:

private sigdaEntities db = new sigdaEntities();

List<string> list = new List<string>();
list.Add("Nom");
list.Add("Representant");


IQueryable<ExplotacionsAgraries> consulta = db.ExplotacionsAgraries;
foreach (string DataColumn in list) {
    if (DataColumn=="Nom") {
        consulta.Where(x => x.nom.Contains(valueSearch));
    }

    if (DataColumn=="Representant") {
    consulta.Where(x => x.representant.Contains(valueSearch));
    }
}

我该怎么做才能获得OR表达式?

4 个答案:

答案 0 :(得分:1)

您可以使用多个.Union()语句手动构建OR。

我还改用了list.Contains(),因为对我来说似乎可以更好地反映代码的作用。

IQueryable<ExplotacionsAgraries> consulta = db.ExplotacionsAgraries;

if (list.Any()) {

    // Start with "nothing":
    var result = consulta.Take(0);

    // Add results from each filter:
    if (list.Contains("Nom"))
        result = result.Union(consulta.Where(x => x.nom.Contains(valueSearch)));

    if (list.Contains("Representant"))
        result = result.Union(consulta.Where(x => x.representant.Contains(valueSearch));

    // And keep the final result
    consulta = result;
}

答案 1 :(得分:0)

我不确定这是否是您要寻找的,但是您可以使用Queryable.Union方法,该方法将

  

产生两个序列的集合并集。

您的代码将如下所示:

IQueryable<ExplotacionsAgraries> consulta = db.ExplotacionsAgraries;
var result = null;
foreach (string DataColumn in list) 
{
    if (DataColumn=="Nom") 
    {
        if (result == null) 
        {
            result = consulta.Where(x => x.nom.Contains(valueSearch));
        }
        else 
        {
            result = result.Union(consulta.Where(x => x.nom.Contains(valueSearch)));
        }
    }

    if (DataColumn=="Representant") 
    {
        if (result == null) 
        {
            result = consulta.Where(x => x.representant.Contains(valueSearch));
        }
        else 
        {
            result = result.Union(consulta.Where(x => x.representant.Contains(valueSearch)));
        }
    }
}

代码未经测试,但可以完成您的工作。

答案 2 :(得分:0)

您可以尝试一下。

IQueryable<ExplotacionsAgraries> consulta = db.ExplotacionsAgraries;
consulta.Where(x => (list.Contains("Nom") &&  x.nom.Contains(valueSearch))
                       || (list.Contains("Representant") && x.representant.Contains(valueSearch)));

答案 3 :(得分:0)

你可以做     db.ExplotacionsAgraries.Where(x => (list.Any(i => i == "Nom") && x.nom.Contains(valueSearch)) || (list.Any(i => i == "Representant") && x.representant.Contains(valueSearch)))