2009-08-11 9 views
1

Je suis en train d'essayer de remplacer les requêtes Criteria que j'utilise pour une page de recherche multi-champs avec des requêtes LINQ utilisant le nouveau fournisseur LINQ. Cependant, je rencontre un problème pour obtenir des comptes d'enregistrements afin que je puisse mettre en œuvre la pagination. J'essaie d'obtenir un résultat équivalent à celui produit par une projection CountDistinct de l'API Criteria utilisant LINQ. Y a-t-il un moyen de faire cela?NHibernate - Equivalent de projection CountDistinct utilisant LINQ

La méthode Distinct() fournie par LINQ ne semble pas se comporter comme je l'attendais, et en ajoutant ".Distinct(). Count()" à la fin d'une requête LINQ regroupée par le champ que je veux un nombre distinct de (une colonne d'entier ID) semble renvoyer un nombre non distinct de ces valeurs.

Je peux fournir le code que j'utilise si nécessaire, mais comme il y a tellement de champs, c'est assez long, donc je ne voulais pas encombrer le post si ce n'était pas nécessaire.

Merci!

Répondre

2

J'ai trouvé un moyen de le faire, même s'il n'est pas optimal dans toutes les situations. Le simple fait de faire un .Distinct() sur la requête LINQ produit en fait un "distinct" dans la requête SQL résultante lorsqu'il est utilisé sans .Count(). Si je provoque l'énumération de la requête à l'aide de .Distinct(). ToList() et puis utilisez la méthode .Count() sur la collection in-memory résultant, j'obtiens le résultat que je veux. Cela ne correspond pas exactement à ce que je faisais à l'origine avec la requête Criteria, puisque le comptage se fait réellement dans le code de l'application, et la liste complète des ID doit être envoyée de la base de données à l'application. Dans mon cas, cependant, étant donné le petit nombre de pièces d'identité distinctes, je pense que cela fonctionnera et ne constituera pas un goulet d'étranglement au niveau des performances.

J'espère, cependant, qu'une véritable opération CountDistinct() LINQ sera implémentée dans le futur.

+0

Je viens de rencontrer le même problème. Cela me semble être un problème avec l'adaptateur LINQ qui génère le mauvais SQL. J'ai dû utiliser le même work-around, forçant l'évaluation de la requête avec ToList() 'avant de faire un' Count() 'dessus. –

0

Vous pourriez essayer de sélectionner la colonne dont vous voulez un nombre distinct en premier. Cela ressemblerait à quelque chose comme: Sélectionnez (p => p.id) .Distinct(). Count(). En l'état, vous distinguez l'objet entier, ce qui compare la référence de l'objet et non les valeurs réelles.

+0

Une bonne idée, et celle que j'ai essayée. Malheureusement, cela ne semble pas fonctionner comme je le pensais. Dans ma situation, il y a en fait 27 identifiants distincts dans la table, mais le faire avec toutes les jointures que j'ai en place renvoie quelque chose comme 47 000. La requête que génère un .Distinct(). Count() ne contient pas de "distinct". Espérons que quelque chose puisse être changé dans une future version. –