首先,我正在使用Fluent NHibernate和LinqToNHibernate。
我有一个查询,根据用户输入的数据对表进行搜索。所以,例如,我正在做这样的事情:
'build the initial query that we will filter--this is lazy loaded
Dim results As IEnumerable(Of Customers) = Me.GetCustomers()
'filter by owner name
If String.IsNullOrEmpty(OwnerName) = False Then
results = results.Where(Function(s) s.Name.Contains(OwnerName))
End If
'execute query
results = results.ToList()
所以基本上我在sql语句中构建一个where语句,如果用户想要按名称搜索。我在我的映射中使用所有延迟配置,因此查询不应该在调用“ToList()”之前检索项目。问题是NHibernate挂起了这个声明。我一开始以为是因为数据库中有这么多记录(约500,000)。
但我改变了我将结果过滤到这一行:
results = SessionFactoryProvider.SessionFactory.CurrentSession.Linq(Of Customer).Where(Function(c) c.Name.Contains(OwnerName))
它的工作非常快。但我似乎无法弄清楚原因。有什么想法吗?
答案 0 :(得分:0)
在第一种情况下,您正在检索所有记录并使用Linq-to-objects来过滤该列表。
在第二种情况下,您将查询发送到数据库(NHibernate.Linq将您的表达式转换为SQL WHERE子句)。
现在,我不知道GetCustomers的返回类型是什么,但由于您将其存储到IEnumerable(Of Customer)中,因此.NET无法了解底层提供程序。如果GetCustomers的代码类似于:
Return CurrentSession.Linq(Of Customer)
...然后问题在于转换。只需将第一行更改为:
Dim results As IQueryable(Of Customers) = Me.GetCustomers()