我如何使用lambdas表达“不在”?
-
30-09-2019 - |
题
我正在尝试创建一个 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 }));
不隶属于 StackOverflow