NHibernate QueryOver:从范围''引用的'SomeTable'类型的变量'line',但它没有定义

时间:2012-06-11 02:35:37

标签: vb.net nhibernate queryover

我正在使用遗留数据,这通常会给我带来一个分成多列的信息。我正在尝试重现以下SQL查询...

SELECT * FROM SomeTable WHERE concat(DescriptionPart1,DescriptionPart2) LIKE 'TEST'

...使用NHibernate QueryOver。所以:

Dim myQuery = Me.Session.QueryOver(Of SomeTable).WhereRestrictionOn( _
    Function(line As SomeTable) line.DescriptionPart1 & line.DescriptionPart2) _
    .IsLike("TEST")

这个自己的陈述会遇到以下异常:

Variable 'line' of type 'SomeTable' referenced from scope '', but it is not defined

任何指示?我试图避免使用魔法字符串,但我总是放弃它(因为使用HQL时,连接表达式+类似函数就像魅力一样)。

2 个答案:

答案 0 :(得分:1)

有点冗长,但它有效

var results = session.QueryOver<SomeTable>()
    .Where(Restrictions.Like(
        Projections.SqlFunction("concat", NHibernateUtil.String, Projections.Property<SomeTable>(x => x.DescriptionPart1), Projections.Property<SomeTable>(x => x.DescriptionPart2)),
        "TEST",
        MatchMode.Anywhere))
    .List();

答案 1 :(得分:0)

为了记录,我使用Linq解决了这个问题。

我的问题的主要观点(我的错,我没有提到过)是重用基类中的代码的可能性,因此我想提取给定表的Description表达式以将其用于多种目的。最终的想法如下实现:

Public MustInherit Class DefaultBusinessLogic(Of Poco)

  Public Overridable ReadOnly Property DescriptionExpression as Expression(Of Func(Of Poco, String))
    Get
       Return Nothing
    End Get
  End Property

  Public Function SearchByDescription(searchArgument as String) as IEnumerable(Of Poco)
     Dim nhSession as ISession = SessionManager.GetSession()

     Dim query = nhSession.Query(Of Poco)

     If Not String.IsNullOrWhitespace(searchArgument) AndAlso
        Me.DescriptionExpression IsNot Nothing Then

        searchArgument = "%" & searchArgument & "%"        

        Dim isLikeMi = ReflectionHelper.GetMethod(Sub() LinqHelpers.IsLike(Nothing, Nothing)) '* See (1)
        Dim isLikeExpression = Expression.Call(isLikeMi, Me.DescriptionExpression.Body, Expression.Constant(searchArgument))
        Dim whereExpression = Expression.Lambda(Of Func(Of Poco, Boolean))(isLikeExpression, Me.DescriptionExpression.Parameters)
        query = query.Where(whereExpression)
     End If

     Return query.ToList()
  End Function

  Public Function GetDescription(pocoRecord as Poco) as String
     If Me.DescriptionExpression Is Nothing Then Return String.Empty

     Return Me.DescriptionExpression.Compile().Invoke(pocoRecord)
  End Function

End Class

Public Class SomeTableBusinessLogic
   Inherits DefaultBusinessLogic(Of SomeTable)

   Public Overrides ReadOnly Property DescriptionExpression as Expression(Of Func(Of Poco, String))
    Get
       Return Function (row as SomeTable) row.DescriptionPart1 & row.DescriptionPart2
    End Get
  End Property

End Class

Public Class SomeTable

   Public Overridable Property Id as Integer
   Public Overridable DescriptionPart1 as String
   Public Overridable DescriptionPart2 as String

End Class