2011-01-18 1 views
7

人口統計データを格納するPopulationという表があるとします。 T-SQLでは、50人以上のカウントを取得するために、私はこのような何かを行う可能性があります: Countを実行すると、Linqはすべてのレコードを最初に取得しますか?

SELECT COUNT(*) FROM POPULATION 
WHERE AGE > 50 

は、私は次のLINQ文が働くだろうと思ったが、それは単にゼロを返し、私はその理由を理解していません。

var count = _context.Population.Count(x => x.Age > 50); 

私が実際にカウントを取得するためには、私は次のいずれかを実行する必要があります。

var count = _context.Populaton.Where(x => x.Age > 50).Count(); 

var count = _context.Population.Select(x => x.Age > 50).Count(); 

なぜ上記のシナリオはケースですか?

+2

除外する実装の詳細はありますか? context.TableName.Count(x => x.SomeCondition);私のためにうまく動作します。 – jeffora

+0

最初のLINQステートメント*は最後の2つと同じように*動作するはずです。それはプロバイダの問題のように思えます。どのLINQプロバイダを使用していますか? – Greg

+0

この質問に対して選択した回答は間違っていて、無関係です。他に何か起こっていることがあります。おそらく、使用しているクエリプロバイダがあります。 – jason

答えて

2

Linqはすべてのレコードを最初に取得しません。最後の可能な瞬間までクエリの実行を延期します。これにより、クエリを最適化することができます。

http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx

私は順序が時々重要であることを見出しました。お役に立てれば。

ボブ

+1

これは 'Count'の呼び出しには当てはまりません。 – jason

-2

修正。 はどんなSQL文でも同様ですが、あなたが従わなければならない特定の順序を持​​っています。 あなたがどこでカウントしたら、基本的に彼にカウントをする何も与えません。

1

すべての場合においてCount()は、データベースから返されたレコードに基づいて、メモリ内の計算を行うことはありませんが、それは実際にCOUNT文を含めるように生成されたSQLを変更します。あなたは、クエリが直ちに実行さCount()を呼び出すと

SELECT 
    COUNT(1) 
    FROM [dbo].[Population] AS [Extent1] 
    WHERE [Extent1].[Age] > 50 

:あなたの生成TSQLクエリの単純化バージョンはようなものになるだろう。すべてのクエリが正しいと思われるので、データベース、プロバイダ、およびコンテキストを調べて、クエリが適切に実行されていることを確認します。

関連する問題