Avatar billede jonas_h Nybegynder
01. november 2008 - 12:51 Der 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?
Avatar billede arne_v Ekspert
01. november 2008 - 19:22 #1
Nej.

De to gange list vil indeholde præcis det samme.
Avatar billede jonas_h Nybegynder
02. november 2008 - 14:01 #2
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"?
Avatar billede arne_v Ekspert
02. november 2008 - 14:23 #3
Korrekt.

De returnerer samme klasse. Som så implementerer både IQueryable og IEnumerable
(IQueryable extender IEnumerable).
Avatar billede jonas_h Nybegynder
02. november 2008 - 14:57 #4
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.
Avatar billede arne_v Ekspert
02. november 2008 - 15:02 #5
Prøv og lav noget kode med de 2 løsninger og udskriv så:

list.GetType().FullName
Avatar billede arne_v Ekspert
02. november 2008 - 15:09 #6
Du kan også udskrive:

list.ToString()

den vil vise SQL'en.
Avatar billede jonas_h Nybegynder
24. november 2008 - 09:58 #7
http://jonkruger.com/blog/2007/10/19/iqueryable-vs-ienumerable-in-linq-to-sql-queries/

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?
Avatar billede arne_v Ekspert
25. november 2008 - 04:28 #8
Ah.

Vi er på sporet.

Der er ikke forskel på:

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);
Avatar billede arne_v Ekspert
25. november 2008 - 04:30 #9
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.
Avatar billede jonas_h Nybegynder
25. november 2008 - 08:52 #10
Okay tak :)

Dvs. hvis man gerne vil "genbruge" det man laver og bygge videre på det, er IQuerable en god løsning at bruge?
Avatar billede arne_v Ekspert
27. november 2008 - 16:46 #11
Ofte bruger man jo var i LINQ sammenhæng. Og den kan også bruge TOP.

Men der er en pointe i at undgå IEnumerable.

Fordi extension metoder ikke er polymorfe.
Avatar billede arne_v Ekspert
19. januar 2009 - 02:16 #12
all set ?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester