2012-07-05 11 views
10

Gdybym zbudować kwerendę powiedzieć:C# LINQ - Opóźnione wykonanie

(kwerenda jest zbudowany przy użyciu klasę XDocument od System.Xml.Linq)

var elements = from e in calendarDocument.Root.Elements("elementName") select e; 

a potem zadzwonić elements.Last() Kilka razy. Czy każde połączenie zwróci najbardziej aktualny element Last()?

Na przykład jeśli mam

elements.Last().AddAfterSelf(new XElement("elementName", "someValue1")); 
elements.Last().AddAfterSelf(new XElement("elementName", "someValue2")); 
elements.Last().AddAfterSelf(new XElement("elementName", "someValue3")); 
elements.Last().AddAfterSelf(new XElement("elementName", "someValue4")); 

Czy rzeczywiście coraz najnowszy element, za każdym razem i dodane nowe do końca czy elements.Last() ten sam element za każdym razem?

Odpowiedz

11

Tak, kwerendy linq są leniwie oceniane. Dopiero wtedy zadzwonisz pod numer Last(), że zapytanie zostanie wykonane. W tym przypadku za każdym razem otrzyma najbardziej aktualny ostatni element.

Myślę, że po raz pierwszy widzę prawidłowe użycie wywołania Last() (lub dowolnego innego operatora, który wykonuje zapytanie) kilka razy. Kiedy ludzie to robią, zazwyczaj przez pomyłkę powodują złą wydajność.

Myślę, że biblioteka linq-to-xml jest wystarczająco inteligentna, aby uzyskać dobrą wydajność dla zapytania, ale nie ufałbym jej bez próby.

+0

Anders, dziękuję. Jeszcze jedno, jeśli nie masz nic przeciwko ... W jaki sposób mogę uczynić elementy var zmiennymi globalnymi? Ponieważ buduję kwerendę tylko raz, chciałbym ją zainicjować i móc wywoływać element.Last() z dowolnego miejsca w moim kodzie. czy to możliwe? – parliament

+0

To nowe i osobne pytanie. Proszę zaksięgować to jako kolejne pytanie (po tym, jak szalenie spróbujesz znaleźć odpowiedź samemu i starałeś się przeszukać SO w poszukiwaniu starych pytań). Zadawanie pytań tutaj prawdopodobnie nie przyniesie wiele pomocy, ponieważ pytanie jest oznaczone jako rozwiązane, nikt nie będzie na to patrzeć. –