我正在尝试创建一个 not in 使用NHLAMBDAEXTENSIONS带有NHIBERNATE标准API的子句。阅读我能够实施的文档 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 })))
有帮助吗?

解决方案

没有直接使用标准(我通常使用LINQ2NH),但是看起来不仅仅想要布尔兰巴达,因此您不能再给它另一个标准。这可能起作用,尽管我已经看到NH在Lambdas的数组成员遇到麻烦:

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

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

如果评估不()条款的翻译器无法使逻辑循环或方法调用的目的神圣,那么您很可能会被困住

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

天哪,我必须以这种方式煮沸表达方式,以使Linq2nhibernate正常工作。

其他提示

将旧世界与Lambdas一起使用:

.Add(Expression.Not(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top