Fluent,NHibernate和PredicateBuilder

时间:2016-01-22 18:17:28

标签: vb.net nhibernate predicatebuilder

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

1 个答案:

答案 0 :(得分:1)

在VB.Net中,我们有OrOrElse,您应该更喜欢使用OrElse代替Or,因为Or是bitwised。看看你有的PredicateBuilder,看看你是否使用Expression.OrExpression.OrElse。如有必要,请将其更改为OrElse。就像在|的C#Or||的{​​{1}}一样。

您可以使用OrElse方法进行尝试,该方法将生成Contains sql语句而不是IN。试试这个:

Or

Obs:我没有测试过。