Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net NHibernate查询版本:变量';第'行;类型为';SomeTable';参考范围'';,但它没有定义_Vb.net_Nhibernate_Queryover - Fatal编程技术网

Vb.net NHibernate查询版本:变量';第'行;类型为';SomeTable';参考范围'';,但它没有定义

Vb.net NHibernate查询版本:变量';第'行;类型为';SomeTable';参考范围'';,但它没有定义,vb.net,nhibernate,queryover,Vb.net,Nhibernate,Queryover,我使用的是遗留数据,它通常会将一个信息拆分为多个列。我正在尝试重现以下SQL查询 SELECT * FROM SomeTable WHERE concat(DescriptionPart1,DescriptionPart2) LIKE 'TEST' …使用NHibernate查询器。因此: Dim myQuery = Me.Session.QueryOver(Of SomeTable).WhereRestrictionOn( _ Function(line As SomeTable)

我使用的是遗留数据,它通常会将一个信息拆分为多个列。我正在尝试重现以下SQL查询

SELECT * FROM SomeTable WHERE concat(DescriptionPart1,DescriptionPart2) LIKE 'TEST'
…使用NHibernate查询器。因此:

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时,串联表达式+like函数就像一个符咒一样工作)。

有点冗长,但它可以工作

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();
var results=session.QueryOver()
.在哪里(
Projections.SqlFunction(“concat”,NHibernateUtil.String,Projections.Property(x=>x.DescriptionPart1),Projections.Property(x=>x.DescriptionPart2)),
“测试”,
匹配模式。任何地方)
.List();

有点冗长,但它可以工作

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();
var results=session.QueryOver()
.在哪里(
Projections.SqlFunction(“concat”,NHibernateUtil.String,Projections.Property(x=>x.DescriptionPart1),Projections.Property(x=>x.DescriptionPart2)),
“测试”,
匹配模式。任何地方)
.List();

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

我问题的要点(我的错,我没有提到)是重用基类中的代码的可能性,所以我想提取给定表的描述表达式,以便将其用于多种用途。最终想法的实施如下所示:

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



  • (1) “IsLike”方法作为NHibernate Linq扩展实现
为了记录在案,我使用
Linq
解决了这个问题

我问题的要点(我的错,我没有提到)是重用基类中的代码的可能性,所以我想提取给定表的描述表达式,以便将其用于多种用途。最终想法的实施如下所示:

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



  • (1) “IsLike”方法作为NHibernate Linq扩展实现