Wyobraźmy mam następujące:Jak LINQ odroczyć wykonanie, gdy w użyciu instrukcji
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
}
}
Zgodnie z dokumentacją wykonanie LINQ będzie odroczyć do ja rzeczywisty wyliczyć wynik, który występuje w kolejce w foreach . Jednak instrukcja using powinna wymusić wiarygodne zbieranie obiektu pod koniec wywołania MyFunct().
Co tak naprawdę się dzieje, kiedy uruchomi się rozdrabniacz i/lub jego wynik?
Jedyne o czym mogę pomyśleć to odroczone wykonanie jest obliczane w czasie kompilacji, więc faktyczne wywołanie jest przenoszone przez kompilator do pierwszej linii foreach, powodując, że użycie działa poprawnie, ale nie działa, dopóki foreach linia? Czy jest jakiś guru, który może pomóc?
EDYCJA:
UWAGA: Ten kod działa, po prostu nie rozumiem w jaki sposób.
Zrobiłem trochę czytania i uświadomiłem sobie w moim kodzie, że nazwałem metodę rozszerzenia ToList(), która oczywiście wylicza wynik. Zachowanie odpowiedzi z zaznaczoną odpowiedzią jest całkowicie poprawne, aby odpowiedzieć na pytanie.
Przepraszamy za jakiekolwiek zamieszanie.
ładne pytanie. Zostałem zbombardowany przez to ... a Using (DataContext) wysadza się spektakularnie – Gishu
Otrzymuję ObjectDisposedException "DataContext dostępny po Dispose." kiedy próbuję tego. Czy Twój obiekt MyDataContext jest autogenerowanym DataContext od projektanta LINQ? Czy dziedziczy po DataContext? –
Trzecie pojęcie: jeśli wyrzucisz swój datakekst za pomocą "Używanie", otrzymasz wyjątek środowiska wykonawczego, jeśli spróbujesz później użyć datacontekstu. Wiem, że to zrobiłem. –