Xai*_*oft 11 c# linq entity-framework predicatebuilder linqkit
我有代码:
var predicate = PredicateBuilder.True<Value>();
predicate = predicate.And(x => x.value1 == "1");
predicate = predicate.And(x => x.value2 == "2");
var vals = Value.AsExpandable().Where(predicate).ToList();
Run Code Online (Sandbox Code Playgroud)
如果我有PredicateBuilder.True<Value>(),它会带回我的期望,但如果我有PredicateBuilder.False<Value>(),它会带回0记录.有人可以解释这是什么区别,为什么在一个场景中我得到0记录在另一个我得到我期望的.我已经阅读了PredicateBuilder这份文件,但有点令人困惑.我觉得这与我Anding在一起的谓词有关吗?
当PredicateBuilder用于逐步建立0个或多个条件的谓词时,从可以添加“中性”谓词开始很方便,因为您可以循环访问这些条件,然后将一个and或多个条件与or最后一个条件一起迭代。例如
var predicate = PredicateBuilder.True<Value>();
foreach (var item in itemsToInclude) {
predicate = predicate.And(o => o.Items.Contains(item));
}
Run Code Online (Sandbox Code Playgroud)
这相当于更简单的布尔逻辑:
var predicate = true;
foreach (var item in itemsToInclude) {
predicate = predicate && o.Items.Contains(item);
}
Run Code Online (Sandbox Code Playgroud)
这相当于
true && ((o.Items.Contains(itemsToInclude[0] && o.Items.Contains.itemsToInclude[1]) ...)
Run Code Online (Sandbox Code Playgroud)
或true && restOfPredicate,结果为trueif restOfPredicate为true,falseif restOfPredicate为is false。因此,为什么将其视为中立。
与起步PredicateBuilder.False,但是,这是相当于false && restOfPredicate,这将永远评估为false。
or与之类似,以开头false就等于false || restOfPredicate,即计算falseif restOfPredicateis false和trueif restOfPredicateis true。并且true || restOfPredicate将始终评估为true。
底线:PredicateBuilder.True与PredicateBuilder.And和PredicateBuilder.False一起用作中立起点PredicateBuilder.Or。
小智 0
工作原理\nTrue 和 False 方法没有任何特殊作用:它们只是创建最初计算结果为 true 或 false 的 Expression> 的便捷快捷方式。所以如下:
\n\nvar predicate = PredicateBuilder.True ();\n 只是一个快捷方式:
\n\nExpression> predicate = c => true;\n当您\xe2\x80\x99通过重复堆叠和/或条件构建谓词时,\xe2\x80\x99(分别)具有 true 或 false 的起点很有用。
\n\n信息完整\n http://www.albahari.com/nutshell/predicatebuilder.aspx
\n| 归档时间: |
|
| 查看次数: |
4823 次 |
| 最近记录: |