この質問は、thatの続編のようなものです。WCFデータのシリアライゼーション:より速く進むことができますか?
何らかの種類のデータで動作するWCFサービスを構築したい場合は、高速かつ効率的であることが望まれます。これを達成するためには、SQL Serverなどのデータストレージバックエンドからデータを要求したWCFクライアントまで、データロードのすべてのセグメントを可能な限り高速に処理する必要があります。
Slaumaなどのコメントをいただき感謝していますが、Entity Frameworkの(最初の)大きなクエリの時間がかかる部分はオブジェクトのマテリアライゼーションであり、エンティティをコンテキストデータベースからの結果が返されたとき。私たちは、後続のクエリですべての処理がはるかに高速になることを確認しました
これらの大きなクエリが読み取り専用操作として使用されると仮定すると、EF MergeOption
をNoTracking
に設定すると、最初のクエリのパフォーマンスが向上するとの結論に達しました。我々がNoTracking
で行ったことは、EFに、同じキーを持っていても、データベースから取り出されたレコードごとに別のオブジェクトを作成するようにEFに指示していました。これにより、クエリに.Include()
文があると追加の処理が行われ、より大きなサイズのデータが返されます。我々は.Include()
文の数に応じて、クエリ速くする(そしておそらく最初のものだけあっても、私たちは本当にNoTracking
オプションを使用することにより、当社の原因を助けなかった -
データは、我々は簡単に自分自身を頼むことができるように大きいかもしれ複数の.Include()
ステートメントを使用したNoTracking
オプションを使用しない後続のクエリは、サーバーからデータが返されたときにさらに多くのオブジェクトが作成されるため、より高速に実行されるためです。
最大の問題は、この量のデータを効率的にシリアル化し、クライアントでデシリアライズする方法です。私はDataContractSerializer
とPreserveObjectReferences
をtrue
に設定しています(私はEF 4.xで生成されたPOCOをクライアントに送信しています。逆も同様です)、より多くのデータを生成したいのですか(NoTracking
)。正直言って、私はデータが.Include()
経由で取得されたナビゲーションプロパティを含まない〜11.000オブジェクトのNoTracking
オプションのクエリから生成され、クライアント側にまだ到着していないことを確認しました。前回私がこれを取り除こうとしたときに、00:10:00のタイムアウトが発生しました(!)
この壁をまだ読んでいるなら、この状況を解決する方法を教えてください。受け入れ可能な結果を得るために使用するシリアライザはどれですか?現在、NoTracking
オプションを使用しない場合、ローカルマシンのwsHttpBinding
のようなカスタムバインディングを介して〜11.000のシリアル化、トランスポートおよび非シリアル化が約5秒かかります。私にとって恐ろしいのは、この大きなテーブルが最終的に〜500,000レコードを含む可能性が高いということです。
私は間違いなくViewModelsを使うべきだと思います。私の現在のデザインは、より良いエンドユーザー経験に傾いています。 DGVには、ナビゲーションプロパティオブジェクトを含む結果セット全体が含まれているため、ユーザーがParentForm.GetCurrentObject()呼び出しの編集を「編集」してコントロールにバインドすると、編集されます。しかし、私はDGVのためのViewModelsの使用と、編集フォームのBackgroundWorkerからのProxy.GetObjectByID()の呼び出しを検討します。先端に感謝します。 –
ODataについて、またはSQLデータベースへの直接アクセスについては、これは問題ありません。利用可能な多くのセキュリティ機能のため、私は「通常の」WCFサービスを好む。 FluentData、Dapper、Massive、またはPetaPocoを使用するための提案については、EntityFrameworkを使用する私の喜びは、エンティティへのLINQがSQLサーバー上にある間にエンティティに直接アクセスできることです。これらの他のソリューションでは、自分のコードで醜い(味わいの)SQLやSQLのような構文を使用する必要があります。 –
私はあなたの問題をよく見ているEF Linqの構文から離れることで理解します。しかし、あなたがより良いパフォーマンスを持ち、ViewModel/Projectionを使って十分に助けにならない場合は、すべてのエンティティクラスに 'Equals'と' HashCode'を実装し、シリアライザがこれを拾いなさい。 – jessehouwing