2012-04-02 8 views
2

Ich versuche, die Anzahl der Elemente zu erhalten, während ich eine Abfrage auf ein IQueryable anwende.IQueryable abgefragte Datenanzahl

Ich bin versucht, es zu tun:

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

Ich denke, das alle Daten über den Zustand erhält und nimmt die Objekte, dann nimmt er die Zählung; also bin ich neugierig, wenn ich zum Beispiel einfach die ID-Spalten nehme und sie in die Liste oder auf eine andere kluge Weise umsetze; diese Zähloperation wäre schneller?

Info: GetAll() => Es ist eine Repository-Pattern-Methode, die IQueryable-Objekte T von der linqToSql-Dateneinheit zurückgibt.

Ich bin offen für alle Arten von verschiedenen Ideen. Dank

+0

Wird eine Datenbank abgefragt? Wenn ja, über welche Technologie? Linq2SQL? EF? –

+0

@ChrisShain es ist in der Frage enthalten, dass es LinqToSql –

Antwort

1

Ich denke, der Aufruf von Wo und ToList ist redundant. siehe unten.

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

tut mir leid, ist es nicht das gleiche? ist es nur lesbarer? –

+1

@TGH Ja, aber wenn Sie nur anrufen, wie ein Lambda funktioniert, warum sollte ich das wo hinzufügen? fühlt sich überflüssig ... weniger tippen mindestens :) – scartag

+0

Ja ich stimme damit überein, dass ich Ihre Änderung zu Count verpasst habe :-) – TGH

1

Wenn Sie dies schneller tun wollen, nur nicht nennen ToList():

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

Auf diese Weise (vorausgesetzt, es ist eine SQL-backed IQueryable<T>) es eine Abfrage wie SELECT COUNT(*) FROM … ausgeführt wird, nicht SELECT * FROM … wie dein Ansatz. Und diese Abfrage sollte viel schneller sein.

+0

in Ordnung ist, ist es schneller, nur ID davon zu nehmen, oder es ist fast das Gleiche? –

+0

Das könnte von Ihrem 'IQueryable'-Provider und Ihrem Datenbank-Negine abhängen, aber ich bezweifle, dass es einen Unterschied machen wird. – svick

+0

ok, vielen Dank –

0

ToList() wird die Abfrage ausführen und Ihr IQeryable in IEnumerable verwandeln. Ich würde die Zählung auf die Where-Klausel setzen. Auf diese Weise wird der Count Teil der Endabfrage

+0

Eine gute Möglichkeit, dies zu visualisieren, ist es, db Profiler zu verbinden. WENN das SQL Server ist, können Sie SQL Server-Profiler – TGH