我正在使用遗留数据,这通常会给我带来一个分成多列的信息。我正在尝试重现以下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时,连接表达式+类似函数就像魅力一样)。
答案 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