Stellen Sie sich vor mir habe folgende:Wie LINQ Ausführung nicht verschieben, wenn sie in einer Anweisung using
private IEnumerable MyFunc(parameter a)
{
using(MyDataContext dc = new MyDataContext)
{
return dc.tablename.Select(row => row.parameter == a);
}
}
private void UsingFunc()
{
var result = MyFunc(new a());
foreach(var row in result)
{
//Do something
}
}
die Dokumentation Nach der Linq Ausführung aufschieben, bis ich das Ergebnis tatsächlich aufzuzählen, die an der foreach in der Leitung auftritt, . Die using-Anweisung sollte jedoch das zuverlässige Erfassen des Objekts am Ende des Aufrufs von MyFunct() erzwingen.
Was passiert eigentlich, wann wird der Entsorger laufen und/oder das Ergebnis laufen?
Ich kann nur daran denken, dass die verzögerte Ausführung zur Kompilierzeit berechnet wird, so dass der eigentliche Aufruf vom Compiler in die erste Zeile der foreach verschoben wird, wodurch die Verwendung korrekt ausgeführt wird, aber nicht bis zur foreach ausgeführt wird Linie? Gibt es einen Guru da draußen, der helfen kann?
EDIT:
HINWEIS: Dieser Code funktioniert, ich verstehe einfach nicht wie.
Ich habe etwas gelesen und ich erkannte in meinem Code, dass ich die ToList() - Erweiterung Methode aufgerufen hatte, die natürlich das Ergebnis aufzählt. Das Verhalten der getippten Antwort ist für die tatsächlich beantwortete Frage vollkommen korrekt.
Entschuldigung für irgendeine Verwirrung.
nette Frage. Ich wurde von diesem bombardiert .. ein Using (DataContext) explodiert spektakulär – Gishu
Ich bekomme eine ObjectDisposedException "DataContext zugegriffen nach Dispose." wenn ich das versuche. Ist Ihr MyDataContext der automatisch generierte DataContext vom LINQ-Designer? Erbt es von DataContext? –
Ich drittens die Idee: Wenn Sie Ihren Datenkontext mit "Using" ablegen, erhalten Sie eine Laufzeitausnahme, wenn Sie versuchen, den Datenkontext später zu verwenden. Ich weiß, dass ich es getan habe. –