我有以下课程:
public class Test
{
public string Text { get; set; }
public int Number { get; set; }
}
我正在这个类上创建Expression<Func<Test, bool>>
类型的表达式树。当我这样做时:
Expression<Func<Test, bool>> predicate1 = x => x.Text.Length > 5 && x.Number > 0;
我得到以下调试视图:
.Lambda #Lambda1<System.Func`2[NHLinqTest.Test,System.Boolean]>(NHLinqTest.Test $x) {
($x.Text).Length > 5 && $x.Number > 0
}
注意:有&&
和 - 操作
当我这样做时:
var y = Expression.Parameter(typeof(Test));
var predicate2 = Expression.And(
Expression.GreaterThan(
Expression.Property(Expression.Property(y, "Text"), "Length"),
Expression.Constant(5)),
Expression.GreaterThan(
Expression.Property(y, "Number"),
Expression.Constant(0)));
我得到以下调试视图:
($var1.Text).Length > 5 & $var1.Number > 0
注意:有&
和 - 操作。为什么我在第二种情况下得到&
?如何修改predicate2
以获取&&
而不是&
?
提前谢谢!
答案 0 :(得分:19)
因为是 &
- 即按位/非短路“和”。对于&&
,您需要Expression.AndAlso
。
另请参阅Expression.Or
(|
)vs Expression.OrElse
(||
)。
另请注意Expression
!= C# - 它与语言无关,因此您可能还查看不取回的某些情况(视觉上)您对C#的期望。
答案 1 :(得分:5)
创建一个表示按位AND操作的BinaryExpression。
创建一个BinaryExpression,它表示一个条件AND操作,仅当第一个操作数的计算结果为true时才会计算第二个操作数。
然后将其与您对&
和&&
运算符的了解进行比较。
答案 2 :(得分:3)
“&amp;” operator和Expression.And表示按位和。 “&amp;&amp;” operator和Expression.AndAlso表示逻辑(和短切)和运算符。