2009-12-14 6 views
0

Tout d'abord, j'utilise Fluent NHibernate avec LinqToNHibernate.NHibernate suspendu sur requête paresseuse

J'ai une requête pour faire une recherche sur une table en fonction des données entrées par l'utilisateur. Ainsi, par exemple, je fais quelque chose comme ceci: Alors

 '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() 

essentiellement Je construis une déclaration sur laquelle l'instruction SQL si l'utilisateur veut effectuer une recherche par nom. J'utilise toutes les configurations paresseuses dans mes mappings, donc la requête ne devrait pas récupérer les éléments jusqu'à ce que le "ToList()" soit appelé. Le problème est que NHibernate se bloque sur cette déclaration. J'ai d'abord pensé que c'était parce qu'il y avait tellement de disques dans le db (environ 500 000).

Mais je changé la ligne où je filtrer les résultats à ceci:

results = SessionFactoryProvider.SessionFactory.CurrentSession.Linq(Of Customer).Where(Function(c) c.Name.Contains(OwnerName)) 

Et ça marche très rapidement. Mais je n'arrive pas à comprendre pourquoi. Des idées?

Répondre

0

Dans le premier cas, vous récupérez tous les enregistrements et utilisez Linq-to-objects pour filtrer cette liste. Dans le deuxième cas, vous envoyez la requête à la base de données (NHibernate.Linq convertit votre expression en une clause SQL WHERE). Maintenant, je ne sais pas quel est le type de retour de GetCustomers, mais puisque vous le stockez dans un IEnumerable (Of Customer), .NET n'a aucun moyen de savoir à propos d'un fournisseur sous-jacent. Si le code de GetCustomers est quelque chose comme:

Return CurrentSession.Linq(Of Customer) 

... Alors le problème est avec cette conversion. Remplacez simplement la première ligne par:

Dim results As IQueryable(Of Customers) = Me.GetCustomers() 
+0

Merci; cela a fonctionné parfaitement :) Je pense que mon problème était mon type de retour étant IEnumerable sur la première ligne au lieu de IQueryable. Je saurai à l'avenir. – Austin