Mik*_*ike 7 c# nhibernate nhlambdaextensions
我正在尝试not in使用NHLambdaExtensions使用NHibernate Criteria API 创建一个子句.阅读文档我能够通过实现来实现该in子句
.Add(SqlExpression.In<Zone>(z => zoneAlias.ZoneId, new int[] { 1008, 1010 }))
Run Code Online (Sandbox Code Playgroud)
但是,当我把它包起来时,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>>'
Run Code Online (Sandbox Code Playgroud)
我正在使用这段代码
.Add(SqlExpression.Not<Zone>(SqlExpression.In<Zone>(x => zoneAlias.ZoneId, new int[] { 1008, 1010 })))
Run Code Online (Sandbox Code Playgroud)
我怎么能做到这一点?使用常规Criteria API我能够做到这一点
.Add(Restrictions.Not(Restrictions.In("z.ZoneId", new[] { 1008, 1010 })))
Run Code Online (Sandbox Code Playgroud)
没有直接使用标准(我通常使用 Linq2NH),但看起来 Not 只是想要一个布尔 lambda,所以你不能给它另一个标准。这可能有效,尽管我已经看到 NH 在处理 lambda 中的数组成员时遇到问题:
.Add(SqlExpression.Not<Zone>(z=>new[]{1008,1010}.Contains(z.ZoneId))
Run Code Online (Sandbox Code Playgroud)
编辑:废话。这里发生的情况是,框架实际上并未使用 lambda,因此在编译时,框架实际上从未在运行查询的过程中调用它。相反,它会反思性地检查委托的 MSIL,对 lambda 表达式进行逆向工程,并将其转换为 SQL 命令的字符串。显然,这是一个相当复杂的过程,设计者试图通过让您指定有关您正在执行的操作的提示(在本例中为您声明的 SqlExpression 类型)并寻找模式来识别该过程来简化该过程。但在这种情况下,即使给出提示,框架也不知道您要做什么。
如果评估 Not() 子句背后的翻译者无法推测逻辑循环或方法调用的目的,那么您很可能会陷入困境
.Add(SqlExpression.Not<Zone>(z=>z.ZoneId == 1008
|| z.ZoneId == 1010))
Run Code Online (Sandbox Code Playgroud)
天知道我必须以这种方式简化表达式才能使 Linq2NHibernate 正常工作。
| 归档时间: |
|
| 查看次数: |
575 次 |
| 最近记录: |