我正在尝试使用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 })))我如何才能做到这一点呢?通过使用常规标准API,我能够做到这一点
.Add(Restrictions.Not(Restrictions.In("z.ZoneId", new[] { 1008, 1010 })))发布于 2010-09-04 03:19:50
我没有直接使用criterion (我通常使用Linq2NH),但是看起来不是简单地想要一个boolean lambda,所以你不能给它另一个criterion。这可能会起作用,尽管我看到NH在lambdas中遇到了数组成员的问题:
.Add(SqlExpression.Not<Zone>(z=>new[]{1008,1010}.Contains(z.ZoneId))编辑:垃圾。这里发生的事情是,框架实际上并没有使用lambda,所以虽然编译了lambda,但框架在运行查询的过程中实际上从来没有调用它。相反,它会反射地检查您的委托的MSIL,对您的lambda表达式进行逆向工程,并将其转换为SQL命令的字符串。显然,这是一个相当复杂的过程,设计人员试图通过让您指定正在做什么的提示(在本例中是您声明的SqlExpression类型)并寻找模式来标识该过程来简化该过程。然而,在这种情况下,即使给出了提示,框架也不知道您要做什么。
如果计算Not()子句背后的翻译器不能预测逻辑循环或方法调用的目的,那么您很可能会被卡住
.Add(SqlExpression.Not<Zone>(z=>z.ZoneId == 1008
|| z.ZoneId == 1010))天晓得,为了让Linq2NHibernate正常工作,我不得不用这种方式来简化表达式。
发布于 2010-12-23 19:48:38
将旧世界与lambdas结合使用似乎是可行的:
.Add(Expression.Not(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }));https://stackoverflow.com/questions/3638522
复制相似问题