01. januar 2011 - 21:23Der er
13 kommentarer og 1 løsning
LINQ or store lister
Hej Eksperter
Du har en tabel med en million entries. Tabellen har et par fields, hvoraf det ene er unikt. Programmatisk vil du nu gerne bruge LINQ (/ lambda expression) til at finde.
MyClass myClass = table.First(r => r.Id = myId);
Dette er en forsimplet problemstilling, men den illustrere fint det jeg forsøger på. Problemet er jo at "table" er en liste som allerede skal være populeret med entries fra databasen for at man kan bruge lambda expressions derpå. Det giver selvfølgelig et meget uhensigtsmæssigt overhead. Så spørgsmålet er nu hvordan jeg kan implementere funktionaliteten deri selv. Jeg har fundet flere eksempler hvor jeg får fingrene i koden nedenunder der parser ens Expression, men jeg ender hver gang med behovet for en fuldt populeret liste, og så forsvinder ideen lidt.
Så spørgsmålet er. Er der en der har et eksempel på hvordan ens LINQ expressions kan håndteres selv.
Hvor den så kun reducerer en meget lille brøkdel. Af de data der er deri. Men "table" skal stadig være populeret for at LINQ virker på listen og det er det overhead jeg gerne vil undgå
For LINQ to Objects vil alle data allerede være i memory og .First() vil tage det første objekt uden at kigge på de andre.
For LINQ to SQL vil data ikke være i memory - data bliver først hentet fra databasen når der er brug for det. Og når man henter en enkelt række med .First() så bliver der udført en SELECT TOP 1 sætning mod databasen og henter derfor kun en enkelt række.
For LINQ to EF bliver data også først hentet når nødvendigt, men jeg har bare ikke checket om den laver en SELECT TOP 1, men det vil jeg tro at den gør.
Med til historien hører, at jeg anvender NHibernate på en postgres database. I forlængelse af det du skrev ovenover må NHibernate.Linq jo være en provider, og den ser lovende ud.
Jeg har kun brugt den binære distribution, så jeg ved ikke hvordan source code er struktureret.
I den binære distribution skal man bruge 4 DLL fra Required_Bins, et antal DLL's fra Required_For_LazyLoading\Xxxx alt efter om man vil bruge lazy loading og hvilken man foretrækker (jeg plejer at bruge LinFu). Og så 1 DLL fra LINQ hvis man vil bruge LINQ.
Med LinFu er det 6 DLL uden LINQ og 7 DLL med LINQ.
Jeg har slet ikke læst noget om 3.x ændringerne, men det kan sagtens tænkes at de har omskrevet LINQ delen. Da MS kom på banen med LINQ fik alle ORM pludseligt meget travlt "so ein ding mussen wir auch haben" og måske blev tingene ikke lige designet helt optimalt.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.