2012-04-02 5 views
2

J'essaie d'obtenir le nombre d'éléments pendant que j'applique une requête à un IQueryable.Nombre de données interrogées IQueryable

Je suis en essayant de le faire comme:

this.lblSth.Text = new Repository<Sth>().GetAll().Where(p => p.PersonId == personId).ToList().Count().ToString(); 

Je pense que cela obtient toutes les données sur l'état et prend les objets, il prend le comte; donc je suis curieux si par exemple je prendrais juste les colonnes d'identification et les jetterais à la liste ou à une autre manière futée; cette opération de comptage serait plus rapide?

Info: GetAll() => Il s'agit d'une méthode de modèle de référentiel qui renvoie des objets IQueryable T à partir de l'entité de données linqToSql.

Je suis ouvert à tous les types d'idées différentes. Merci

+0

Est-ce une base de données? Si oui, via quelle technologie? Linq2SQL? EF? –

+0

@ChrisShain il est inclus dans la question qu'il est LinqToSql –

Répondre

1

Je pense que l'appel à Where et ToList est redondant. voir ci-dessous.

this.lblSth.Text = new Repository<Sth>().GetAll().Count(p => p.PersonId == personId).ToString(); 
+0

Je suis désolé, n'est-ce pas la même chose? est-ce juste plus lisible? –

+1

@TGH ouais mais si appeler seulement compte comme un lambda fait le travail, pourquoi voudrais-je ajouter le où? se sent redondant ... moins tapant au moins :) – scartag

+0

Oui je suis d'accord avec cela que j'ai raté votre changement de compte :-) – TGH

1

Si vous voulez faire plus rapide, il suffit de ne pas appeler ToList():

this.lblSth.Text = new Repository<Sth>().GetAll() 
             .Where(p => p.PersonId == personId) 
             .Count() 
             .ToString(); 

De cette façon, (en supposant qu'il est un SQL soutenu IQueryable<T>) il exécutera une requête comme SELECT COUNT(*) FROM …, pas SELECT * FROM … comme votre approche. Et cette requête devrait être beaucoup plus rapide. ToList() exécutera la requête et transformera votre IQUeryable en IEnumerable.

+0

bien, est-il plus rapide de prendre simplement Id de lui ou il est presque même? –

+0

Cela pourrait dépendre de votre fournisseur 'IQueryable' et de votre base de données négative, mais je doute que cela fasse une différence. – svick

+0

ok, merci beaucoup –

0

J'appellerais le compte sur la clause where. De cette façon, le compte deviendra une partie de la requête de fin

+0

Un bon moyen de visualiser ceci est de l'accrocher au profileur db. Si c'est SQL Server, vous pouvez vous profileur SQL Server – TGH

Questions connexes