2017-05-29 124 views
0

几天前我问了this question,得到了很好的回应。还有一件事我遇到了麻烦。在构建表达式树时如何查找错误。c#表达式 - 如何检查虚假

下面是一个例子:

query.Where(d => (allCk && d.FacilityId == facilityId) //1. 
      || 
      (!allCk && allSelected && d.FacilityId == facilityId && !ids.Contains(d.Id)) //2. 
      || 
      (!allCk && !allSelected && ids.Contains(d.Id)) //3. 

到目前为止,检查d.FacilityId == facilityIdids.Contains(d.Id)是否是最容易的部分。

现在,正如您所看到的,根据块的不同,相同的布尔值检查其真实性,其他地方则相反。例如,在第1行中:成功的时候是allCK == true而另外两个是allCK == false

这就是我写第一行的方式。

/* d */ 
     ParameterExpression pe = Expression.Parameter(typeof(Document), "d"); 

     /*(allCk && d.FacilityId == facilityId) ==> exp0*/ 
     var facilityParam = Expression.Constant(facilityId); 
     var allCkParam = Expression.Constant(allCk); 

     Expression facilityIdProp = Expression.Property(pe, "FacilityId"); 
     Expression facilityIdEql = Expression.Equal(facilityIdProp, facilityParam); 

     Expression exp0 = Expression.AndAlso(allCkParam, facilityIdEql); 

我该如何表达我的意图,例如,成功的时候是allCK == false? (其中包括2号线和3中allCKallSelected,并ids.Contains()需要返回false

感谢您的帮助

回答

3

您只需在Expression.NotExpression.IsFalse()来包装你的价值。

例如:

Expression.AndAlso(Expression.Not(allCkParam), ...) 
+0

作为一个方面的问题,请参见编辑。 – Richard77

+1

@ Richard77请打开一个新问题,而不是追加问题。记得; SO主要用于帮助*未来*访问者;一般问题很容易搜索 – Rob

+0

因为。谢谢。 – Richard77