2017-10-02 9 views
2

さまざまな場所にあるさまざまなコンピュータの環境を考えてみましょう。これらのコンピュータでは、Windowsアプリケーションが実行され、5分ごとに新しいデータが同期するようにタイマーが確認されます。情報は、インターネット接続を介して中央の場所に同期されます。クライアントコンピュータと集中サーバーの両方のデータベースは、SQL Serverデータベースです。SingleOrDefault()クエリはリモートで実行されますか?

リモート(集中化された)サーバーに書き込む前に、同じIDを持つレコードがリモートに存在するかどうかを確認するためにSingleOrDefault()メソッドが使用されます。クライアントは使用されたインターネットデータの急増を報告しています。集中データベースが大きくなりすぎて、SingleOrDefaultがクエリ可能なデータ全体を接続経由で返して、クエリ側のクライアント側を返すのかどうか疑問に思います。これが事実だろうか?同じことをしない別の解決策は何でしょうか?

+1

主キーでクエリを実行しているため、要素が1つしかないことがわかります。 SingleOrDefaultの代わりにfirstOrDefaultを使用することを検討してください。最初のものはTop 1にクエリを行い、2番目のクエリはTop 2にクエリし、2番目にクエリがないことを確認します。この余分な小切手はあなたの場合には目的がありません。 –

+0

合意すると、SQLルールによって重複はありません。 SingleOrDefaultはクライアント側に問い合わせをしませんが、私はそれにもかかわらず解決します –

答えて

3

あなたがQueryable.SingleOrDefaultを使用している場合(あなたはselecttop 2の使用を見ることができ、データベースクエリをログに記録した場合)、それがサーバー上で処理されます。

Enumerable.SingleOrDefaultを使用している場合は、(データベース)クライアントで処理されます。

IQuerable<T>からIEnumerable<T>に(たとえば、AsEnumerableを使用して)変換しないでください。

これを検出するには、コード検査を行うか、生成されたSQLを調べます。

top 2は、複数の結果を検出するために使用されます。これは、SingleOrDefaultを使用するとエラーになります。

+0

有益で明確な答えをありがとう。これは、メソッドがIQuerayble.SingleOrDefaultなので、インターネットデータの膨大な量が他の何かの原因でなければならないことを意味します。 –

+0

なぜ「トップ2」になるのでしょうか? 'SIngleOrDefault'を言っているわけではありません。つまり、一つのレコードが返されることを意味します。 –

+0

@EhsanSajjad脚注を参照してください! 2行を取得すると、例外が発生します。 'Single'は、正確に1でない場合はエラーを意味します。 'SingleOrDefault'は、0,1またはエラーのいずれかを意味します。複数行を許可する場合は、 'FirstOrDefault'を使用します。 – Richard

関連する問題