作为记录,我使用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
- (1) 'IsLike' 方法被实现为 NHibernate Linq 扩展。从这里提取。