Prise en compte avec NHibernate + Linq + Futur
Je veux faire de la pagination avec NHibernate lors de l'écriture d'une requête Linq. Il est facile de faire quelque chose comme ceci:
return session.Query<Payment>()
.OrderByDescending(payment => payment.Created)
.Skip((page - 1)*pageSize)
.Take(pageSize)
.ToArray();
Mais avec ce je ne pas obtenir aucune info sur le nombre total d'éléments. Et si je fais juste un simple .Count(), qui va générer un nouvel appel à la base de données.
J'ai trouvé cette réponse qui résolu par l'utilisation future. Mais il utilise des Critères. Comment puis-je faire cela avec Linq?
- Session D'Utilisation.QueryOver au lieu de cela est qu'il économise de l'intellisense et "compileability", et il est un SelectCount méthode. Si vous avez besoin je peux fournir des détails exemple d'utilisation
- Oui s'il vous plaît, QueryOver semble bien fonctionner aussi!
- (J'ai repéré une erreur dans ma solution et l'a supprimé pour éviter toute confusion. Je vais poster la version fixe peu de temps)
Vous devez vous connecter pour publier un commentaire.
La difficulté avec l'aide de contrats à Terme avec LINQ, c'est que des opérations comme le Comte exécuter immédiatement.
Comme @vandalo découvert,
Count()
aprèsToFuture()
exécute les Compter dans la mémoire, ce qui est mauvais.La seule façon d'obtenir le comte, dans un avenir requête LINQ est d'utiliser
GroupBy
dans un invariant de terrain. Un bon choix serait quelque chose qui est déjà une partie de vos filtres (comme un "est actif" de la propriété)Voici un exemple en supposant que vous avez une propriété de ce type de Paiement:
Bien sûr, l'alternative est de faire deux allers-retours, ce qui n'est pas mauvais de toute façon. Vous pouvez toujours réutiliser l'original IQueryable, ce qui est utile lorsque vous souhaitez faire un échange dans une couche de haut niveau:
Mise à jour (2011-02-22): j'ai écrit un post de blog sur cette question, et une bien meilleure solution.
Le blog suivant est une mise en œuvre de ToFutureValue qui fonctionne avec LINQ.
http://sessionfactory.blogspot.com.br/2011/02/getting-row-count-with-future-linq.html
Il a une petite erreur sur la ligne suivante qui doit être changé à partir de ce.
À ceci:
Appliquer après le changement que vous pouvez utiliser que les requêtes de cette façon:
C'est quelque chose que je viens de découvrir que le Linq to NH gère très bien, le ToRowCountQuery supprime prendre/saut à partir de la requête et un avenir de nombre de lignes.
Ok, il semble que ce devrait être le travail dans votre cas, mais j'ai pas testé:
Tester d'abord avant de upvoting 😉
UPD: désolé, comme je vous comprends maintenant, vous avez besoin pour obtenir le nombre de tous les éléments. Ensuite, vous devez exécuter la requête sans pagination: