C# 带Linq的WHERE子句中的构建或表达式
我需要创建一个包含OR表达式的WHERE子句的SQL Linq。它的操作数存储在一个列表中 通过这段代码,我得到了一个AND表达式: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>
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如果列表为空或列表不包含任何关键字,则不会生成结果。在这种情况下,原始代码不应用过滤。