2012-04-02 17 views
2

照会をIQueryableに適用しているときに項目の数を取得しようとしています。好きなことをやろうとし照会可能な照会データ数

I'am:

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

私は、これは条件間ですべてのデータを取得し、オブジェクトを取ると思いますが、それは、カウントを取ります。だから、もし私がちょうどId列を取り出してリストや他のスマートな方法にキャストするなら、私は興味があります。その操作をカウントする方が早いでしょうか?

Info:GetAll()=> linqToSqlデータエンティティからIQueryableオブジェクトTを返すリポジトリパターンメソッドです。

私はすべての種類のさまざまなアイデアを公開しています。おかげ

+0

これはデータベースにクエリしますか?もしそうなら、どんな技術を介して? Linq2SQL? EF? –

+0

@ChrisShainそれはLinqToSqlであるという質問に含まれています –

答えて

1

WhereとToListへの呼び出しは冗長です。 下記を参照してください。

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

私はごめんなさい、同じではない?それはちょっと読みやすいのですか? –

+1

@TGHええ、ラムダとして電話するだけで仕事ができるのなら、なぜ私はどこに追加したいのですか?冗長な感じ...少なく入力すること: – scartag

+0

はい私はカウントにあなたの変更を逃したことに同意します:-) – TGH

1

あなたはこれより早く行いたい場合は、単にToList()を呼び出すことはありません:

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

この方法は、(それがSQL担保IQueryable<T>だと仮定して)それはないSELECT * FROM …のように、SELECT COUNT(*) FROM …のようなクエリを実行しますあなたのアプローチ。そして、このクエリははるかに速くなければなりません。

+0

大丈夫ですか、それを取るのが早いのですかそれともほとんど同じですか? –

+0

それはあなたの 'IQueryable'プロバイダとあなたのデータベースの否定に依存するかもしれませんが、違いが生じるのではないかと疑います。 – svick

+0

ok、ありがとうございます –

0

ToList()はクエリを実行し、IqueryableをIEnumerableに変換します。私はwhere句でカウントを呼び出します。そのようにCountは終了クエリの一部になります

+0

これを視覚化するには、dbプロファイラに接続するのが良い方法です。これはSQL Serverの場合は、SQL Serverのプロファイラ – TGH