2011-08-05 12 views
11

Zastanawiam się, czy istnieje biblioteka .NET lub narzędzie innej firmy do wykonywania Entity Framework, takie jak zapytania LINQ na dokumentach XML. Wiem, że istnieje już LINQ do XML, który pozwala na wykonywanie zapytań na obiekcie XDocument, który jest JUŻ załadowany do pamięci, ale co jeśli dokument XML jest bardzo duży (ponad gigabajt)?Linq Do XML, yield i inne

Chciałbym mieć opcję przekazania tego zapytania do obiektu XmlReader raczej do obiektu XDocument. Czy to możliwe prosto po wyjęciu z pudełka?

+0

Ok, po wyszukaniu trochę bardziej ja wpadłem na ten wątek: http://stackoverflow.com/questions/2441673/reading-xml-with-xmlreader-in-c I tak: http://blogs.msdn.com/b/xmlteam/archive/2007/03/24/streaming-with-linq-to-xml-part-2.aspx Zastanawiam się nad rozwiązaniem tego problemu przy użyciu niemal dokładnej techniki , ale wciąż nie ma pełnego wsparcia i lepszej wydajności. –

Odpowiedz

3

Spójrz na this codeplex project.

+0

Dokładnie tego, czego szukałem, uwielbiam sposób, w jaki to jest kodowane! Dzięki! –

1

Nie wierzę, trzeba będzie rozwiązanie, które będzie pasował wszystkie dokumentów XML, ale może zrobić.

Utworzę klasę, która implementuje IEnumerable<T> i pobiera XmlReader, którą chcesz przesłać strumieniowo.

Następnie należy utworzyć typ, który będzie używany dla parametru typu T w implementacji IEnumerable<T>.

Gdy trzeba, że ​​w swojej realizacji GetEnumerator, nazwałbyś różne Move* i Read* metod na XmlReader które pozwolą Ci zbudować pojedynczą instancję T.

Gdy masz instancję T w ręku, możesz użyć yield return, aby uzyskać pozycję. Reszta ciała GetEnumerator będzie pętla odpowiednio podczas strumieniowania przez XmlReader.

Dzięki temu będziesz przesyłać strumieniowo instancje T tak jak je otrzymujesz, bez konieczności wczytywania całego dokumentu do pamięci.

Musisz przetestować, oczywiście, ile dokumentów chcesz przeczytać na raz.

+0

Dzięki, znalazłem kilka podobnych rozwiązań przy użyciu techniki, o której wspomniałeś powyżej, ale uwielbiałem narzędzie jdv innego producenta. –