Свободный v1.4, NHibernate v4.0.2.4000, SQL ServerСвободный, NHibernate, и PredicateBuilder
Я видел несколько сообщений, где 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'
CORRECTION - После предложения Фелипе я изменил свой код 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
Ошибка была проблемой - я преобразовал код C# PredicateBuilder в VB.NET и использовал Or вместо OrElse. Я изменю свое первоначальное сообщение, чтобы включить пересмотренный код VB.NET PredicateBuilder. –
Что касается предложения «Содержит». Это было доказательством концепции для создания сложного запроса «на лету» на основе данных, основанных на данных. В этом примере не отображаются дополнительные условия AND/OR, которые я в конечном итоге включу. Я буду использовать «Содержит», где могу, хотя. Благодаря!!! –
Другое Редактировать: И нужно было изменить на AndAlso –