我如何表达“不在”使用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