2016-01-22 4 views
1

Свободный 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 

ответ

1

В VB.Net мы имеем Or и OrElse, вы должны предпочесть использование OrElse вместо Or, потому что Or является bitwised. Посмотрите на PredicateBuilder, который у вас есть, и посмотрите, используете ли вы Expression.Or или Expression.OrElse. При необходимости измените его на OrElse. Это как в C# | для Or и || для OrElse.

Вы можете попробовать его, используя метод Contains, который будет генерировать оператор IN sql вместо Or. Попробуйте это:

Public Function TestingWorldQuery() As List(Of EmployeeView) 

    Return m_Session.Query(Of EmployeeView)().Where(Function(x) {"AGRI", "CORP", "FOODS"}.Contains(x.OpCoOrgId)).ToList() 

End Function 

Obs: Я не проверял.

+0

Ошибка была проблемой - я преобразовал код C# PredicateBuilder в VB.NET и использовал Or вместо OrElse. Я изменю свое первоначальное сообщение, чтобы включить пересмотренный код VB.NET PredicateBuilder. –

+0

Что касается предложения «Содержит». Это было доказательством концепции для создания сложного запроса «на лету» на основе данных, основанных на данных. В этом примере не отображаются дополнительные условия AND/OR, которые я в конечном итоге включу. Я буду использовать «Содержит», где могу, хотя. Благодаря!!! –

+0

Другое Редактировать: И нужно было изменить на AndAlso –