C# 带Linq的WHERE子句中的构建或表达式

C# 带Linq的WHERE子句中的构建或表达式,c#,linq,C#,Linq,我需要创建一个包含OR表达式的WHERE子句的SQL Linq。它的操作数存储在一个列表中 通过这段代码,我得到了一个AND表达式: private sigdaEntities db = new sigdaEntities(); List<string> list = new List<string>(); list.Add("Nom"); list.Add("Representant"); IQueryable<ExplotacionsAgraries>

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

通过这段代码,我得到了一个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表达式呢?

我不确定这是否是您想要的,但您可以使用该方法,它将

生成两个序列的集合并集

您的代码如下所示:

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)));
        }
    }
}
代码没有经过测试,但在您的情况下,它应该可以完成这项工作。

您可以试试这个

IQueryable<ExplotacionsAgraries> consulta = db.ExplotacionsAgraries;
consulta.Where(x => (list.Contains("Nom") &&  x.nom.Contains(valueSearch))
                       || (list.Contains("Representant") && x.representant.Contains(valueSearch)));
你可以这么做 db.ExplotacionsAgraries.Wherex=>list.Anyi=>i==Nom&& x、 nom.ContainsvalueSearch | | list.Anyi=>i==Representant&&
x、 ContainsvalueSearch

您可以使用多个语句手动构建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;
}

您需要分配添加where运算符的结果,例如consulta=consulta.Wherex=>x.nom.containsValueSearch您可以共享所需的sql输出吗?如果列表为空或列表不包含任何关键字,则不会生成任何结果。原始代码在这种情况下不应用筛选。@PeterB如果列表不包含任何关键字,则结果集将不进行筛选,并返回所有记录。否,它的行为类似于db.ExplotacionsAgraries.Wherex=>false | | false如果列表为空或列表不包含任何关键字,则不会生成结果。在这种情况下,原始代码不应用过滤。