Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 传递nhibernate查询的where表达式_Vb.net_Nhibernate - Fatal编程技术网

Vb.net 传递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

我需要将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
方法是通过在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()方法,如果成功,我将发布一些代码并批准此答案。