Wie gebe ich ein IQueryable von Linq to SQL-Abfrage, wenn der dbContext wird mit einer 'mit' - block?
Ich habe die Kodierung mit 'using' - Blöcke zu, aber ich Frage mich, ob ich zurückkehren kann, ein IQueryable aus den folgenden, ohne das Objekt wird entsorgt, bevor ich darauf zugreifen.
public IQueryable<Contact> GetContacts(string clientID)
{
using (dbDataContext db = new dbDataContext())
{
var contacts = from _contacts in db.Contacts
where _contacts.ClientID == clientID
orderby _contacts.LastName ascending
select _contacts;
return contacts;
}
}
Kann ich entfernen Sie einfach den 'über' - block und lassen .Net-verwalten der Objekte, oder kann ich Linq, um die Abfrage auszuführen früh-und Rückgabe der besiedelten Objekt.
- beachten Sie, dass es nicht wirklich notwendig ist, explizit über den datacontext. gute Frage aber trotzdem.
- äh, ja, ist es. Jede Einweg-Objekt sollte angenommen werden verlangen zur Verfügung, und sollte angemessen behandelt werden, IMO. Es kann halten Sie eine offene Verbindung, wie zum Beispiel...
- Ich werde einfach auf das, was ich gelesen habe auf mehreren blogs, und auch so ziemlich alle Beispiele von ScottGu und die Linq-team. Die offizielle microsoft-position, soweit ich entnehmen kann, ist, dass Sie darüber verfügen kann, wenn es macht Sie sich besser fühlen, aber es ist wirklich nicht nötig. Siehe leedumond.com/blog/about-disposing-the-datacontext als ein Beispiel für einige Diskussion zu entsorgen und die zeitlich verzögert die Ausführung beschriebene problem in dieser Frage.
- Scott Guthrie: "Das Datacontext-Objekt tatsächlich nicht offen halten, alle verbindungen zu der Datenbank - so dass Sie nicht haben, um ausdrücklich entsorgen Sie es. Stattdessen ruft es neue verbindungen aus dem Verbindungspool nur, wenn es Sie braucht, und dann gibt Sie zurück, sobald es fertig ist." Sie können nicht wirklich bekommen, es auf irgendeine höhere Autorität als die.
- Für jedermann, das schaut, hier ein aktualisierter link für den Artikel @fearofawhackplanet geschrieben: web.archive.org/web/20130702164240/http://leedumond.com/blog/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht erwarten, weiter zu Komponieren, die Daten (auf dem db-server), dann:
obwohl in diesem Fall würde ich lieber zurück
IEnumerable<Contact>
oderIList<Contact>
zu machen, die nicht zusammensetzbar Natur offensichtlich. Mit derAsQueryable
Ansatz, werde es noch werden zusammensetzbar, aber es werde Komponieren über LINQ-to-Objects (so nach es abgerufen hat, werden die Datensätze aus der Datenbank).Wenn Sie tun erwarten, weiter zu Komponieren, dann sollten Sie übergeben Sie die Daten-Kontext (oder, wenn möglich, im upstream
IQueryable<something>
) in die Methode, und lassen Sie die Anrufer-Griff Lebensdauer:IList<T>
ist, dass es veröffentlicht wird.Count
etc (und ein indexer), die den Zugang bequemer. Aber unabhängig vonIList<T>
vsIEnumerable<T>
es immer noch ist einList<T>
, so dass der Speicher Nutzung ist unabhängig. Oder für eine prägnante Antwort: verwenden SieIList<T>
Können Sie das Kontext-Objekt ein Mitglied Instanz der Klasse? Wenn Sie können, Sie werden aufschieben der Aufruf zum ausführen der Abfrage, bis Sie wirklich berühren der enumerator hinter dem IQueryable-Instanz, die Sie zurückgeben. Es hängt davon ab, was Sie tun möchten. Brauchen Sie, um zurückzukehren IQueryable von dieser Methode, oder können Sie machen nicht mit, IEnumerable ?
Den Kontakt Objekt-Instanz in IQueryable Ergebnis eingestellt werden, behalten die Referenz des datacontext verwendet, die innerhalb des using-Blocks und werden in der client-code viel wie erwartet. Sie werden in der Lage zu führen latente SQL-Operationen auf die resultierende IQueryable Instanz und andere IQueryable operationas normal.
konnten Sie so etwas tun
GetEnumerator()
genannt wird auf der zugrunde liegenden Abfrage. Also kein workee.