2011-01-21 136 views
2

您好我正在使用动态LINQ,使用LinqKit的PredicateBuilder。动态LINQ查询

如果你看看代码,在TODO注释后面,我想完成类似 假设objectList中有2个对象。 object1,Object2的 (object1.property1和object1.property2)OR(object2.property1和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

这是最后谓词: ' finalPredicate {F =>(真OrElse运算调用(F =>(((真AndAlso调用(P => p.ef.Contains(值(服务1 + <> (p => p.fname.Contains(value(Service1 + <> c__DisplayClass2).item.ff),f))AndAlso Invoke(p => p.subject。包含(值(Service1 + <> c__DisplayClass2).item.fs),f)),f))} System.Linq.Expressions.Expression >` – WhoIsNinja 2011-01-21 22:22:47

+0

这是错误消息:参数'f'没有绑定在指定的LINQ to Entities查询表达式中。 – WhoIsNinja 2011-01-21 22:23:55

回答

1

所以我发现从其他计算器的问题有一天,我很抱歉,我没有链接,现在该职位的解决方案,但是这是解决方案

当使用谓词中断言,你必须每次展开()。查看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()); 
    } 
} 
3
var finalPredicate = PredicateBuilder.True(); 

应该是

var finalPredicate = PredicateBuilder.False(); 

真或x =总是真实的(x被忽略)。

False or x = x。


另一个问题是在lambda表达式中捕获循环变量的方式。

foreach (var item in objectList) 
{ 
    var loopItem = item; 
    //now use loopItem instead of item. 
    ... 
} 
+0

@David,谢谢。但是我得到这个错误:参数'f'未绑定在指定的LINQ to Entities查询表达式中。 – WhoIsNinja 2011-01-21 20:47:15

2

不应该finalPredicate作为False开始吗?这将始终评估为真。


编辑:

说完看着您发布的异常代码,我想你可以把它非常大致为:

(伪)

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的调用有关。但是,如果不了解您的情况或所涉及的数据,就很难说清楚这一点。

希望这会有所帮助。