Fluent v1.4,NHibernate v4.0.2.4000,SQL Server
我见过一些帖子,其中带有嵌套Lambda表达式的Predicate Builder未在NHibernate v3中进行评估。是不是v4也有这个问题?
Public Function TestingWorldQuery() As List(Of EmployeeView)
Dim EmpView = From q In m_Session.Query(Of EmployeeView)()
Dim expr = PredicateBuilder.False(Of EmployeeView)()
For Each _opco In {"AGRI", "CORP", "FOODS"}
Dim opco As String = _opco
expr = expr.Or(Function(x) x.OpCoOrgId = opco)
Next
EmpView = EmpView.Where(expr)
Return EmpView.ToList
End Function
无法将'NHibernate.Hql.Ast.HqlBitwiseOr'类型的对象强制转换为 输入'NHibernate.Hql.Ast.HqlBooleanExpression'
更正 - 在Felipe的建议之后,我修改了我的VB.NET PredicateBuilder代码以使用OrElse。我的代码现在正在运行。
Imports System.Linq.Expressions
Public Module PredicateBuilder
Public Function [True](Of T)() As Expression(Of Func(Of T, Boolean))
Return Function(f) True
End Function
Public Function [False](Of T)() As Expression(Of Func(Of T, Boolean))
Return Function(f) False
End Function
<System.Runtime.CompilerServices.Extension()> _
Public Function [OrElse](Of T)(ByVal expr1 As Expression(Of Func(Of T, Boolean)), ByVal expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[OrElse](expr1.Body, invokedExpr), expr1.Parameters)
End Function
<System.Runtime.CompilerServices.Extension()> _
Public Function [AndAlso](Of T)(ByVal expr1 As Expression(Of Func(Of T, Boolean)), ByVal expr2 As Expression(Of Func(Of T, Boolean))) As Expression(Of Func(Of T, Boolean))
Dim invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast(Of Expression)())
Return Expression.Lambda(Of Func(Of T, Boolean))(Expression.[AndAlso](expr1.Body, invokedExpr), expr1.Parameters)
End Function
End Module
答案 0 :(得分:1)
在VB.Net中,我们有Or
和OrElse
,您应该更喜欢使用OrElse
代替Or
,因为Or
是bitwised。看看你有的PredicateBuilder,看看你是否使用Expression.Or
或Expression.OrElse
。如有必要,请将其更改为OrElse
。就像在|
的C#Or
和||
的{{1}}一样。
您可以使用OrElse
方法进行尝试,该方法将生成Contains
sql语句而不是IN
。试试这个:
Or
Obs:我没有测试过。