2011-10-06 1 views
0

Mon code:Get real nombre de collection IQueryable après Distinct()

IQueryable<string> keys = dr.Localization.GetQuery().Select(x => x.Key).Distinct(); 
int count = keys.Count(); 

Collection keys a collection normale après distincte, il est bon. Mais dans keys.Count(), j'ai le nombre de toutes les lignes de la table sans distincte. Mon ORM est NHibernate. Que puis-je faire pour avoir le nombre réel de collection IQueryable?

(sans mouler vers d'autres types de collection)

Merci!

+0

Si votre fournisseur LINQ produit en fin de compte SQL, jetez un oeil à ça. Cela pourrait forcer "distinct" à la fin de la requête, ce qui retournerait évidemment le "mauvais" résultat. – dlev

Répondre

0

Il semble que votre fournisseur interrogeable soit bogué, vous devriez probablement signaler ce bogue.

En attendant, une façon d'obtenir le compte correctement serait d'utiliser keys.AsEnumerable().Count(). MAIS, cela entraînera l'évaluation de l'ensemble de la collection. Donc, si la collection résultante contient de nombreux éléments, vous les récupérerez tous juste pour obtenir le nombre.

Une autre option que vous pouvez essayer est d'utiliser quelque chose comme keys.GroupBy(k => k).Count(), ou peut-être la même chose sans le Distinct() et espérons que le même bug n'est pas présent dans ce cas aussi.

0

À moins que l'appel à Count() ne soit pas transformé en une requête SQL qui sélectionne uniquement le nombre, la méthode d'extension Count() doit quand même énumérer tous les objets. Puisque vous avez mis des clés dans une variable, je suppose que vous en aurez besoin plus tard, éventuellement en l'énumérant. Ainsi, vous pouvez les chercher tous ici comme si

string[] keys = dr.Localization.GetQuery().Select(x => x.Key).Distinct().ToArray(); 
int count = keys.Length; 

Mais je suis curieux, dans votre exemple ce que fait ce produit (requête et résultat):

int count = dr.Localization.GetQuery().Select(x => x.Key).Distinct().Count();