Ich habe mit "Verwenden" -Blöcken programmiert, aber ich frage mich, ob ich ein IQueryable aus dem Folgenden zurückgeben kann, ohne dass das Objekt entsorgt wird, bevor ich darauf zugreife.
%Vor%Lösche ich einfach den 'using'-Block und lasse .Net die Objekte verwalten, oder kann ich Linq veranlassen, die Abfrage frühzeitig auszuführen und das ausgefüllte Objekt zurückzugeben.
Wenn Sie nicht erwarten, die Daten (am DB-Server) weiter zu verfassen, dann:
%Vor% obwohl ich in diesem Fall lieber IEnumerable<Contact>
oder IList<Contact>
zurückgeben würde, um die nicht zusammensetzbare Natur offensichtlich zu machen. Mit dem AsQueryable
Ansatz ist es immer noch zusammensetzbar, aber es wird über LINQ-to-Objects erstellt (also nachdem es die Datensätze aus der Datenbank abgerufen hat ).
Wenn Sie tun erwarten, es weiter zu verfassen, dann sollten Sie den Datenkontext (oder, falls möglich, ein upstream IQueryable<something>
) in der Methode übergeben, und lassen Sie den Anrufer die Lebensdauer behandeln:
Können Sie das Kontextobjekt zu einer Mitgliedsinstanz Ihrer Klasse machen? Wenn Sie können, können Sie den Aufruf aufschieben, um die Abfrage auszuführen, bis Sie tatsächlich den Enumerator berühren, der der von Ihnen zurückgegebenen IQueryable-Instanz entspricht. Es hängt davon ab, was Sie tun möchten. Müssen Sie IQueryable von dieser Methode zurückgeben, oder können Sie mit IEnumerable auskommen?
Die Kontaktobjektinstanz in der IQueryable-Ergebnismenge behält den Verweis auf den Datenkontext, der im using-Block verwendet wird, und arbeitet im Client-Code erwartungsgemäß. Sie können verzögerte SQL-Operationen für die resultierende IQueryable-Instanz ausführen und andere IQueryable-Operationen normalerweise ausführen.
Tags und Links .net c# linq-to-sql