Vb.net NHibernate查询版本:变量';第'行;类型为';SomeTable';参考范围'';,但它没有定义
我使用的是遗留数据,它通常会将一个信息拆分为多个列。我正在尝试重现以下SQL查询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)
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扩展实现李>