C#学习教程:LINQ中连接多个where子句为OR而不是ANDvarints=new[]{1,3,5,7};varquery=fromiinintsselecti;query=query.Where(q=>q==3);query=query..Where(q=>q==7);我想要的是能够动态添加where子句,但使用OR而不是AND如果您想继续使用强类型的Linq查询,您应该查看LinqKit和谓词构建。我已经将它用于类似这样的事情,并发现它与And/Or堆叠过滤器配合使用效果很好。查看Nutshell摘录中的C#4.0/3.0以获得更深入的信息。这是我的代码片段://设置初始谓词obj然后堆叠在其他谓词上:basePredicate=basePredicate.And(p=>false);varpredicate1=PredicateBuilder.True();foreach(SearchParmsparminparms){switch(parm.field){case"firstname":predicate1=predicate1.And(p=>p.FirstName.Trim().ToLower().Contains(sValue));休息;//etc...}}//根据您的和/或参数值运行开关以确定堆叠:if(Parm.isAnd){basePredicate=basePredicate.And(predicate1);}else{basePredicate=basePredicate.Or(predicate1);像这样的示例怎么样?varquery=fromiinintswhereCheckConditions(i)selecti;publicboolCheckConditions(inti){varconditions=WhereConditions;//一个IEnumerable>为每个动态添加的条件(varconditioninconditions){if(condition(i))returntrue;}返回假;您可以将其扩展得更聪明一些,但我就是这样做的。编辑:抱歉,第一个示例是AND,现在已更改为OR。所以它在第一次遇到pass条件时返回true。使用ExpressionVisitor帮助构建基于具有OR/AND关系的两个表达式的表达式。本回答来自JefferyZhao的博客。内部类ParameterReplacer:ExpressionVisitor{publicParameterReplacer(ParameterExpressionparamExpr){this.ParameterExpression=paramExpr;}publicParameterExpressionParameterExpression{get;私有集;}publicExpressionReplace(Expressionexpr){returnthis.Visit(expr);}protectedoverrideExpressionVisitParameter(ParameterExpressionp){returnthis.ParameterExpression;}}publicstaticExpression>And(thisExpression>one,Expression>another){varcandidateExpr=Expression.Parameter(typeof(T),"candidate");varparameterReplacer=newParameterReplacer(candidateExpr);varleft=parameterReplacer.Replace(one.Body);varright=parameterReplacer.Replace(another.Body);varbody=Expression.And(左,右);返回Expression.Lambda>(body,candidateExpr);}publicstaticExpression>Or(thisExpression>one,Expression>another){varcandidateExpr=Expression.Parameter(typeof(T),"candidate");varparameterReplacer=新的ParameterReplacer(candidateExpr);varleft=parameterReplacer.Replace(one.Body);varright=parameterReplacer.Replace(another.Body);varbody=Expression.Or(左,右);返回Expression.Lambda>(body,candidateExpr);您可以使用Union方法:varints=new[]{1,3,5,7};varquery=ints.Where(q=>q==3);query=query.Union(ints.Where(q=>q==7));您是在谈论在lambda中指定多个条件吗?query=query.Where(q=>q==3||q==7);试试这个varints=new[]{1,3,5,7};varquery=ints.select(X=>X).where(X=>X==3||X==7);我正在尝试做这样的事情,这就是我想出的:所有分享的内容都是OR而不是AND,如果对大家有用,需要了解更多C#学习教程,希望大家多多付出attention—//各种测试用例booluseTestCase1=true;booluseTestCase2=true;booluseTestCase3=false;query=query.Where(q=>(q==3&&useTestCase1)||(q==7&&useTestCase2)||(q==10&&useTestCase3));涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
