动态LINQ查询

时间:2011-01-21 20:40:10

标签: .net sql wpf linq

您好我正在使用动态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);
  }
}

3 个答案:

答案 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());
  }
}