記録のために、私は を使用してこの問題を解決し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 拡張機能として実装されました。ここから抜粋。