1

SQL にいくつかのテーブルがあります。1 つはControls (典型的な CRUD の種類のオブジェクト) で、もう 1 つはAttachmentsです。添付ファイルは、FK を介してコントロールを参照します (多数の添付ファイルが存在する可能性があります)。添付ファイルには、特に、名前とファイル データを含む varbinary 列も含まれます。

linq を通じて、Controlには Attachments プロパティがあります。

既存の添付ファイルのリストなど、多くの情報を表示するコントロール ビュー (MVC) があります。そのリストは、ヘルパー メソッドを介して行われます。

public static string FileBox(this HtmlHelper helper, string name, IEnumerable<Models.Attachment> files, bool writable)
    { ... }

この関数は、添付ファイルをループ処理し、添付ファイル名を含む順序付けられていないリストを書き出します。

まれに、タイムアウト エラーが発生します。そのエラーの抜粋を次に示します。

System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

...

at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext()
   at System.Data.Linq.EntitySet`1.Load()
   at System.Data.Linq.EntitySet`1.GetEnumerator()
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at IRSoxCompliance.Helpers.Html.FileBox(HtmlHelper helper, String name, IEnumerable`1 files, Boolean writable) in C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\IRSoxCompliance\IRSoxCompliance\IRSoxCompliance\Helpers\Html.cs:line 228
   at ASP.views_edit_control_edit_test_aspx.__Render__control1(HtmlTextWriter __w, Control parameterContainer) in c:\inetpub\wwwroot\Views\Edit\Control_Edit_Test.aspx:line 109

...

そう...

  1. これらのタイムアウトは、コントロールが既に読み込まれているのに、Attachments行が遅延読み込みされ、ヘルパーからのみ読み込まれるという事実によるものであると想定するのは正しいですか? そして、これは主に、私が必要のない 50 MB のデータを取得しているという事実によるものでしょうか?

  2. これを防ぐにはどうすればよいですか?a) テーブルの分割を避けたい。b) コントロールに、バイナリ以外のすべてを持つ新しいクラスを返す AttachmentsNoBinary 部分プロパティを作成できますか? c)バイナリ列だけで「遅延ロード」をオンにできるようです。これは機能しますか?もしそうなら、テーブルをクリアしてからリロードする習慣があるため、DBML では何も変更しないようにしています。だから私はこの設定を失います。紛失しないようにする方法はありますか?パーシャルから設定できますか? それとも、オンになっていることをアサートできる単体テストでしょうか?

解決策:答えに基づいて、代わりに次のことに気付きました:

foreach (Attachment file in controls.Attachments) {
  response.write(file.name);
}

私は代わりに行うことができます:

foreach (string filename in controls.Attachments.Select(a => a.name)) {
  response.write(filename);
}

最終的に varbinary 列のロードを延期することになりましたが、dbml ファイルをリセットした場合に再度そのオプションを設定することを忘れないようにと願っています。

ありがとう、ジェームズ

4

1 に答える 1

0
  1. Linq が添付ファイルの読み込みを怠っているのは間違いありません。varbinary データをデータベースからドラッグするかどうかは、クエリによって異なります。投稿できますか?

  2. 問題を解決するためにデータベースの構造を変更する必要はありません。クエリが varbinary フィールドに触れていないことを確認してください。これを確認するには、適切な選択/射影が必要です。また、コントローラーに関連するすべてのアタッチメントを常に取得することがわかっている場合は、LoadWith を使用して、オンデマンドで遅延読み込みするのではなく、一度にすべてを取得するよう Linq に指示できます。これにより、ジョブを完了するために必要なデータベース ラウンド トリップの数が削減されます。

MSDN の LoadWith 情報

また、テーブルでインデックスが正常であることを確認する価値があります。

何が起こっているかを実際に把握するには、データベースで SQL クエリ アナライザをポイントし、コードを実行します。どのような SQL がデータベースにヒットしているかを正確に確認でき、それを取得して Management Studio で実行し、どのデータがドラッグバックされているかを正確に確認できます。

これが少し役立つことを願っています。

于 2009-08-06T21:20:02.760 に答える