Vb.net 传递nhibernate查询的where表达式
我需要将nhibernate where表达式作为函数参数:Vb.net 传递nhibernate查询的where表达式,vb.net,nhibernate,Vb.net,Nhibernate,我需要将nhibernate where表达式作为函数参数: Public Function FindByCriteria(customCriteria As Expression(Of Func(Of Transaction, Boolean))) As IList(Of Transaction) Dim query = GetBasicQuery() query = query.Where(customCriteria) return query.ToList() End Function
Public Function FindByCriteria(customCriteria As Expression(Of Func(Of Transaction, Boolean))) As IList(Of Transaction)
Dim query = GetBasicQuery()
query = query.Where(customCriteria)
return query.ToList()
End Function
方法是通过在lambda表达式中设置函数的地址来调用的,因为在VB.NET中表达式不支持多行
Public Sub SearchService(criteria As SearchCriteria)
_transactionService.FindByCriteria(Function(x) BuildCustomCriteriaForCustomer(x, criteria))
...
End Sub
然后在BuildCustomCriteriaForCustomer中,我使用x和criteria
然而,这似乎不起作用,它只是抛出NotSupportedException,没有任何细节
是否可以给出函数范围之外的表达式?您必须构建一个有效的表达式树,该表达式树可以转换为sql。您的函数
BuildCustomCriteriaForCustomer
无法转换为sql。因此,此函数必须将SearchCriteria转换为表达式树
我假设您的
SearchCriteria
是一个带有属性名和枚举的模型。使用NhibernateSession.CreateCriteria()
并从SearchCriteria中创建ICriterion
对象将更容易添加到其中。您必须构建一个有效的表达式树,该表达式树可以转换为sql。您的函数BuildCustomCriteriaForCustomer
无法转换为sql。因此,此函数必须将SearchCriteria转换为表达式树
我假设您的
SearchCriteria
是一个带有属性名和枚举的模型。使用NhibernateSession.CreateCriteria()
并从SearchCriteria中创建ICriterion
对象以添加到其中会容易得多。构建用于会话的动态Linq查询非常好
但您不能期望NHibernate理解BuildCustomCriteriaForCustomer()
的编译代码。您必须确保整个critera都是LINQ表达式
您显示的代码相当于:
Dim query = GetBasicQuery()
query = query.Where(Function(x) BuildCustomCriteriaForCustomer(x, criteria))
这当然行不通,因为NHibernate不知道BuildCustomCriteriaForCustomer()
做什么(NHibernate可以用这些知识进行扩展,但在这种情况下没有帮助
相反,要:
Public Function BuildCustomCriteriaForCustomer(criteria As SearchCriteria)
As Expression(Of Func(Of Transaction, Boolean))
Dim f as Expression(Of Func(Of Transaction, Boolean))
x = Function (x as Customer)
something
EndFunction
return x
EndFunction
这将使编译器以NHibernate可以分析的格式保留LINQ表达式
此外,在LINQ表达式中添加动态数量的“and”和“and”或“or”也很有用。构建动态LINQ查询以用于
会话。Query()
是非常好的,但您不能期望NHibernate理解BuildCustomCriteriaForCustomer()的编译代码
。您必须确保整个critera是LINQ表达式
您显示的代码相当于:
Dim query = GetBasicQuery()
query = query.Where(Function(x) BuildCustomCriteriaForCustomer(x, criteria))
这当然行不通,因为NHibernate不知道BuildCustomCriteriaForCustomer()
做什么(NHibernate可以用这些知识进行扩展,但在这种情况下没有帮助
相反,要:
Public Function BuildCustomCriteriaForCustomer(criteria As SearchCriteria)
As Expression(Of Func(Of Transaction, Boolean))
Dim f as Expression(Of Func(Of Transaction, Boolean))
x = Function (x as Customer)
something
EndFunction
return x
EndFunction
这将使编译器以NHibernate可以分析的格式保留LINQ表达式
此外,在LINQ表达式中添加动态数字“and”和“and”或“or”也很有用。在我看来很像“抽象ORM反模式”。为什么不创建一个
公共函数FindBySearchCriteria(customCriteria作为搜索条件)作为IList(事务的)
在您的transactionService中?customCriteria包含两个非常特定于客户的字段,我不想用特定于客户的字段污染我的搜索服务。在我看来很像“抽象ORM反模式”。为什么不创建一个公共函数FindBySearchCriteria(CustomCriterias作为搜索条件)作为IList(关于交易)
在您的transactionService中?customCriteria包含两个非常特定于客户的字段,我不想用特定于客户的字段污染我的搜索服务。是的,SearchCriteria是带有属性名称和枚举的模型。我将尝试使用CreateCriteria()方法,如果成功,我将发布一些代码并批准此答案。是的,SearchCriteria是带有属性名称和枚举的模型。我将尝试CreateCriteria()方法,如果成功,我将发布一些代码并批准此答案。