01. november 2008 - 12:51Der er
11 kommentarer og 1 løsning
Hvornår udføres den egentligt SQL-query i linq?
Ville høre om der er én som kan bekræfte/afkræfte min opfattelse af hvordan LinQ præcis fungerer:
IENumerable<Obj> list = from s in Data.Obj select s;
IQueryable<Obj> list = from s in Data.Obj select s;
Ved ovenstående, er det så korrekt at den første sætning vil udføre selve sql-kaldet til databaen ved kørsel og at det andet kald vil "gemme" selve linq-queryen og muliggør at lave yderligere linq-queries ovenpå og egentigt først vil lave sql-kaldet senere?
Hvis jeg har de to ovenstående lister, og udfører endnu en linq query på listerne, f.eks. take(20), vil der så ingen forskel være på hvad der sker "i baggrunden"?
Hmm... synes at have læst et blog indlæg hvor de havde analyseret sql-kaldene på de to, og når der blev brugt en IENumerable, var TOP 20 ikke med i sql-kaldet hvorimod det med IQuerable var med. Men nu kan jeg selvfølgelig ikke finde det igen.
Ved godt det er et gammelt spørgsmål, men det var på denne blog jeg læste det jeg startede med at spørge om. Har han ret, eller bliver sql-forespørgslen udført på præcis samme tidspunkt?
IEnumerable<T1> a = (from r in t1 select r).Take(2);
og:
IQueryable<T1> b = (from r in t1 select r).Take(2);
Men der er forskel på:
IEnumerable<T1> aa = from r in t1 select r; aa = aa.Take(2);
og:
IQueryable<T1> bb = from r in t1 select r; bb = bb.Take(2);
Den første vil lave en SELECT uden TOP.
Fordi selvom første aa LINQ faktisk returnerer samme type som første bb LINQ, så ved C# det ikke. Den ved ikke at den står med en DataQuery - den ved kun at den har en Enumerable. Og så vælger den en anden strategi.
Og det er nemt at verifcere fordi man får TOP med::
IEnumerable<T1> aaa = from r in t1 select r; aaa = ((IQueryable<T1>)aaa).Take(2);
Så konklusionen er at der ikke er forskel på om man assigner til en IEnumerable eller IQueryable, men at der er forskel om man laver LINQ på den ene eller den anden.
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.