LinqKit PredicateBuilder链式调用与分步调用结果为何不同?
LinqKit链式与分步调用表达式结果不同的原因
核心原因很直白:LinqKit里的And/Or方法不会修改原表达式对象,而是返回一个全新的、组合后的表达式实例。你之前的写法问题出在没正确接收这些返回值。
两种写法的差异拆解
未赋值的链式调用:
如果你只是写andPredicate.And(x => x.StartsWith('1')).And(x => x.EndsWith('1'))却不把结果赋值给变量,那这个组合了两个条件的新表达式根本没被使用,原andPredicate还是最初的状态,自然达不到预期。未赋值的分步调用:
像andPredicate.And(x => x.StartsWith('1')); andPredicate.And(x => x.EndsWith('1'))这种写法,每次调用And都会基于原andPredicate生成新表达式,但你没把返回值存回andPredicate,所以原变量从头到尾都没变,等于两次And调用都白做了。
正确写法示例(实现A && B && (C || D))
不管用链式还是分步,都要把每次组合的结果赋值给变量:
分步写法
// 初始化基础AND条件 var predicate = PredicateBuilder.True<YourEntityType>(); predicate = predicate.And(x => x.A); // 条件A predicate = predicate.And(x => x.B); // 条件B // 构建OR子条件 var orSubPredicate = PredicateBuilder.False<YourEntityType>(); orSubPredicate = orSubPredicate.Or(x => x.C); // 条件C orSubPredicate = orSubPredicate.Or(x => x.D); // 条件D // 组合最终条件 predicate = predicate.And(orSubPredicate);
链式写法
var predicate = PredicateBuilder.True<YourEntityType>() .And(x => x.A) .And(x => x.B) .And( PredicateBuilder.False<YourEntityType>() .Or(x => x.C) .Or(x => x.D) );
只要确保每次调用And/Or后,把返回的新表达式赋值给变量,链式和分步的结果就是一致的。
内容的提问来源于stack exchange,提问作者Hafinator
相关产品推荐
相关产品推荐

