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
...
そう...
これらのタイムアウトは、コントロールが既に読み込まれているのに、Attachments行が遅延読み込みされ、ヘルパーからのみ読み込まれるという事実によるものであると想定するのは正しいですか? そして、これは主に、私が必要のない 50 MB のデータを取得しているという事実によるものでしょうか?
これを防ぐにはどうすればよいですか?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 ファイルをリセットした場合に再度そのオプションを設定することを忘れないようにと願っています。
ありがとう、ジェームズ