NHibernate挂在懒惰加载查询

时间:2009-12-14 20:57:40

标签: nhibernate fluent-nhibernate lazy-loading

首先,我正在使用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))

它的工作非常快。但我似乎无法弄清楚原因。有什么想法吗?

1 个答案:

答案 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()