Frage

Ich habe eine Reihe von Tabellen in SQL. Eine davon ist Bedienelemente (eine typische CRUD Art von Objekt) und man ist Anhänge . Anhänge Referenzen Regler über eine FK (es können viele Anhänge sein). Anhänge auch beinhaltet unter anderem einen Namen und eine varbinary Spalte mit Dateidaten.

Durch Linq, Kontrolle hat eine Attachments Eigenschaft.

Ich habe eine Steuerelemente Ansicht (MVC), die eine Vielzahl von Informationen zeigt, einschließlich einer Auflistung der vorhandenen Anhänge. Das Angebot wird über eine Hilfsmethode durchgeführt:

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

Diese Funktion Schleifen durch die Anlagen und schreibt mit den Namen von Anhängen eine ungeordnete Liste aus.

Selten, erhalte ich einen Timeout-Fehler, und hier ist ein Ausschnitt aus diesem Fehler:

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

...

So ...

  1. Bin ich zu der Annahme korrigieren, dass diese Timeouts auf die Tatsache zurückzuführen ist, dass, während die Kontroll bereits geladen ist, die Anhänge Zeilen sind faul-geladen, und nur von der geladen Helfer? Und dass dies vor allem aufgrund der Tatsache, dass ich vielleicht 50 MB Daten greifen, die ich nicht brauche?

  2. Wie verhindere ich das? a) Ich möchte die Tabelle zu vermeiden, zu splitten. b) Kann ich eine AttachmentsNoBinary Teil Eigenschaft auf dem Steuerelement, das eine neue Klasse zurückgibt, die alles, aber die binären hat? c) Es scheint, ich auf ‚Verzögerung geladen‘ anschalten kann nur die binäre Spalte. Ob das funktioniert? Wenn ja - ich habe es einen Punkt, der nicht etwas zu ändern in der DBML gemacht, weil ich eine Gewohnheit des Löschens einen Tisch haben und dann neu zu laden. Also würde ich diese Einstellung verlieren. Gibt es eine Möglichkeit, um sicherzustellen, dass ich nicht verlieren? Kann ich es von meinem Teil? Oder vielleicht ein Gerät zu testen, die behaupten, dass es eingeschaltet?

SOLUTION : Auf der Grundlage der Antwort, erkannte ich, dass statt:

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

Ich kann stattdessen tun:

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

Auch wenn ich am Ende defer-Laden die Varbinary Spalte, in der Hoffnung, dass ich nicht vergessen, diese Option setzen wieder soll ich meine dbml Datei zurückgesetzt.

Danke, James

War es hilfreich?

Lösung

  1. Sie haben Recht, dass Linq verzögertes Laden ist Ihre Anlagen. Unabhängig davon, ob es sich um die varbinary-Daten nach unten aus der Datenbank ziehen, hängt von der Abfrage. Können Sie es schreiben?

  2. Sie brauchen nicht die Struktur der Datenbank zu ändern, um das Problem zu lösen. Stellen Sie sicher, dass Ihre Abfrage nicht ist das varbinary Feld zu berühren - Sie werden eine geeignete Auswahl / Projektion benötigen um dies sicherzustellen. Auch wenn Sie wissen, dass Sie werden immer alle Anhänge mit einem Controller im Zusammenhang erhalten Sie Loadwith verwenden könnten Linq zu instruieren, alles auf einmal, anstatt faul Laden auf Anfrage zu bekommen. Dadurch wird die Anzahl der Datenbank-Rundreisen abgeholzt erforderlich, um den Job zu erledigen.

Loadwith Informationen über MSDN

Auch lohnt, dass die Indizes auf den Tischen sind ok.

Um etwas wirklichen Einblick in das zu bekommen, was auf Punkt SQL Query Analyzer auf die Datenbank wird und dann den Code ausführen. Sie werden sehen, genau das, was SQL die Datenbank trifft und kann es in Management Studio greifen und laufen, genau zu sehen, welche Daten zurück gezogen wird, zu werden.

Hope, das hilft ein wenig.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top