我如何表达“不在”使用lambdas?

我试图用NHLambdaExtensions在NHibernate Criteria API中创建一个not in子句。 阅读文档,我能够通过做实现in子句

.Add(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }))

但是,当我将它包装在SqlExpression.Not不会收到错误消息

Error   5   The best overloaded method match for 'NHibernate.LambdaExtensions.SqlExpression.Not<oms_dal.Models.Zone>(System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>)' has some invalid arguments
Error   6   Argument '1': cannot convert from 'NHibernate.Criterion.ICriterion' to 'System.Linq.Expressions.Expression<System.Func<oms_dal.Models.Zone,bool>>'

我正在使用这段代码

.Add(SqlExpression.Not<Zone>(SqlExpression.In<Zone>(x => zoneAlias.ZoneId, new int[] { 1008, 1010 })))

我怎样才能做到这一点? 使用常规的Criteria API,我能够做到这一点

.Add(Restrictions.Not(Restrictions.In("z.ZoneId", new[] { 1008, 1010 })))

没有直接使用标准(我通常使用Linq2NH),但它看起来像不只是想要一个布尔lambda,所以你不能给它另一个标准。 这可能工作,但我已经看到NH在lambda表达式中遇到数组成员的问题:

.Add(SqlExpression.Not<Zone>(z=>new[]{1008,1010}.Contains(z.ZoneId))

编辑:废话。 这里发生的事情是该框架实际上并没有使用lambda,所以在编译时,框架在运行查询的过程中从未真正调用它。 而是反思性地检查委托的MSIL,反向设计您的lambda表达式并将其转换为SQL命令的字符串。 也就是说,显然,设计者试图通过指定你正在做什么(在这种情况下是你声明的SqlExpression的类型)的提示并寻找模式来识别流程来简化一个相当复杂的流程。 但在这种情况下,即使有提示,框架也不知道你想要做什么。

如果翻译者在评估Not()子句后无法预测逻辑循环或方法调用的目的,那么你很可能会被困住

.Add(SqlExpression.Not<Zone>(z=>z.ZoneId == 1008
                                || z.ZoneId == 1010))

善良知道我必须通过这种方式煮沸表达Linq2NHibernate正常工作。


与lambda一起使用旧世界似乎有效:

.Add(Expression.Not(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }));
链接地址: http://www.djcxy.com/p/2579.html

上一篇: How do I express “not in” using lambdas?

下一篇: Selecting the pixels with highest intensity in OpenCV