您好我正在使用动态linq,使用LinqKit的PredicateBuilder。
如果你看看代码,在TODO评论之后排队,我想完成类似的事情 可以说objectList中有2个对象。 object1,object2 (object1.property1 AND object1.property2)OR(object2.property1 AND object2.property2)
我知道TODO之后的行不正确,但我正在寻找该行的正确版本。
var finalPredicate = PredicateBuilder.True(); foreach (var item in objectList) { var predicate = PredicateBuilder.True(); predicate = predicate.And (p => p.Description.Contains (item.property1)); predicate = predicate.And (p => p.Description.Contains (item.property2)); //TODO: finalPredicate = finalPredicate.Or(predicate); } }
答案 0 :(得分:3)
var finalPredicate = PredicateBuilder.True();
应该是
var finalPredicate = PredicateBuilder.False();
True或x =始终为真(忽略x)。
错误或x = x。
另一个问题是在lambda表达式中捕获循环变量的方式。
foreach (var item in objectList)
{
var loopItem = item;
//now use loopItem instead of item.
...
}
答案 1 :(得分:2)
不应该将finalPredicate开始为假吗?这总是评估为真。
编辑:
看了你发布的异常代码,我认为你可以认为它非常大致如下:
(伪代码)
finalPredicate =
true ||
(true &&
p.ef.Contains(item.FilterDomain) &&
p.fname.Contains(item.ff) &&
p.subject.Contains(item.fs)
)
请注意,这不是真正的意思;你正在构建一个表达式树,这与经典的命令式C#不同(所以这个编辑可能是在讨论downvotes)。但它可能会让你更容易想到它。
所以你在这里至少有两个问题:
true || ...
。真值||任何东西都会产生真实。因此,如果您将finalPredicate
初始化为True,那么无论如何,整个事情都将是真的。实际上,your other expressions might not even get evaluated,这就是为什么在将finalPredicate
初始化为False时只能看到此异常的原因。这是你的代码被击中的唯一时间。for
循环中的某个地方有一个错误,我的猜测是它与Contains
的调用有关。但是,如果不了解您的情况或涉及的数据,就很难说清楚。希望这有帮助。
答案 2 :(得分:1)
所以我有一天从其他stackoverflow问题找到了解决方案,我很抱歉我现在没有该帖子的链接,但这是解决方案
在谓词中使用谓词时,每次都必须展开()。使用修复程序查看TODO的下一行。这解决了我的问题。
还解决了真正的错误问题,但这是合乎逻辑的错误。
var finalPredicate = PredicateBuilder.False(); foreach (var item in objectList) { var predicate = PredicateBuilder.True(); predicate = predicate.And (p => p.Description.Contains (item.property1)); predicate = predicate.And (p => p.Description.Contains (item.property2)); //TODO: finalPredicate = finalPredicate.Or(predicate.Expand()); } }