代码之家  ›  专栏  ›  技术社区  ›  James S

通过LINQ访问带有varbinary数据的行是否会导致超时?如何修复?

  •  1
  • James S  · 技术社区  · 17 年前

    控制 附件 附件 控制 通过FK(可以有许多附件)。 附件

    通过linq, 控制

    我有一个控件视图(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. 假设这些超时是由于控件已经加载,而 行是延迟加载的,并且仅从辅助对象加载?这主要是因为我正在获取我不需要的50MB数据?

    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文件时不要忘记再次设置该选项。

    谢谢,

    1 回复  |  直到 17 年前
        1
  •  0
  •   Daniel M    17 年前
    1. 你是对的,Linq懒得加载你的附件。它是否从数据库中向下拖动varbinary数据取决于查询。你能把它寄出去吗?

    2. 您不需要更改数据库的结构来解决问题。确保您的查询没有触及varbinary字段——您需要一个适当的选择/投影来确保这一点。另外,如果您知道总是要获取与控制器相关的所有附件,那么可以使用LoadWith指示Linq一次获取所有附件,而不是按需延迟加载。这将减少完成任务所需的数据库往返次数。

    LoadWith info on MSDN

    要真正了解数据库中的SQL查询分析器,然后运行代码。您将确切地看到SQL对数据库的影响,并可以在ManagementStudio中获取和运行它,以确切地看到哪些数据被拖回。

    希望这有点帮助。