Vra

Ek is verward oor die verskil.Om redelik nuut .Net, ek weet ek kan navraag IEnumerables met behulp van die Linq uitbreidings.So, wat is hierdie IQueryable en hoe verskil dit?


Sien ook Wat is die verskil tussen IQueryable[T] en IEnumerable[T]? wat oorvleuel met hierdie vraag.

Was dit nuttig?

Oplossing

IEnumerable<T> verteenwoordig'n vorentoe-net wyser van T..NETTO 3.5 bygevoeg uitbreiding metodes wat ingesluit die LINQ standard query operators soos Where en First, met enige operateurs wat vereis dat predicates of anonieme funksies neem Func<T>.

IQueryable<T> implemente dieselfde LINQ standaard soektog operateurs, maar aanvaar Expression<Func<T>> vir predicates en anonieme funksies. Expression<T> is'n saamgestel uitdrukking boom, 'n gebroke-up weergawe van die metode ("half-saamgestel" as jy wil) wat gebruik kan word ontleed deur die queryable se verskaffer en gebruik word dienooreenkomstig.

Byvoorbeeld:

IEnumerable<Person> people = GetEnumerablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

IQueryable<Person> people = GetQueryablePeople();
Person person = people.Where(x => x.Age > 18).FirstOrDefault();

In die eerste blok, x => x.Age > 18 is'n anonieme metode (Func<Person, bool>), wat uitgevoer kan word soos enige ander metode. Enumerable.Where sal uit te voer die metode een keer vir elke persoon, yielding waardes waarvoor die metode teruggekeer true.

In die tweede blok, x => x.Age > 18 is'n uitdrukking boom (Expression<Func<Person, bool>>), wat kan beskou word as "is die" Ouderdom "eiendom > 18".

Dit kan dinge soos LINQ-om-te-SQL om te bestaan, want hulle kan ontleed die uitdrukking boom en omskep dit in'n ekwivalente SQL.En omdat die verskaffer nie nodig om uit te voer totdat die IQueryable is vervat (dit implemente IEnumerable<T>, na al), kan dit kombineer verskeie navraag operateurs (in die voorbeeld hierbo Where en FirstOrDefault) om slimmer keuses te maak oor hoe om uit te voer die hele navraag teen die onderliggende data bron (soos die gebruik van SELECT TOP 1 in SQL).

Sien:

Ander wenke

In die werklike lewe, as jy 'n ORM soos LINQ-tot-SQL

  • As jy 'n IQueryable skep, dan is die vraag kan omgeskakel word na SQL en loop op die databasis bediener
  • As jy 'n IEnumerable skep, dan sal al rye sal in die geheue getrek as voorwerpe voor loop die navraag.

In beide gevalle, as jy nie bel 'n ToList() of ToArray() dan sal navraag uitgevoer word elke keer as dit gebruik word, so, sê, jy het 'n IQueryable en jy vul 4 lys bokse daaruit, dan is die vraag sal duur wees teen die databasis 4 keer.

Ook as jy jou navraag uit te brei:

q.Select(x.name = "a").ToList()

Toe met 'n IQueryable die gegenereerde SQL sal where name = "a" bevat, maar met 'n IEnumerable baie meer rolle sal terugbring uit die databasis getrek, dan is die x.name = "a" tjek sal gedoen word deur NET.

"Die primêre verskil is dat die uitbreiding metodes gedefinieer vir IQueryable neem Expression voorwerpe in plaas van Func voorwerpe, wat beteken dat die afgevaardigde dit ontvang is 'n uitdrukking boom in plaas van 'n metode om te roep. IEnumerable is ideaal vir die werk met in-geheue versamelings, maar IQueryable maak voorsiening vir 'n afgeleë bron data, soos 'n databasis of web diens "

Bron: hier

IEnumerable IEnumerable is die beste geskik is vir die werk met in-geheue versameling. IEnumerable nie beweeg tussen items, dit is vorentoe net versameling.

IQueryable IQueryable beste pas vir afgeleë bron data, soos 'n databasis of web diens. IQueryable is 'n baie kragtige funksie wat 'n verskeidenheid van interessante uitgestelde uitvoering scenario (soos blaai en samestelling gebaseer navrae) moontlik maak.

So wanneer jy eenvoudig iteraat deur die in-geheue versameling, gebruik IEnumerable, as jy nodig het om enige manipulasie doen met die versameling soos Dataset en ander databronne, gebruik IQueryable

Die beginsel verskil is dat IEnumerable al sy elemente al die tyd sal opsom, terwyl IQueryable elemente sal opsom, of selfs doen ander dinge, wat gebaseer is op 'n navraag. Die soektog is 'n uitdrukking ( 'n data voorstelling van Net kode), wat 'n IQueryProvider moet verken / interpreteer / stel / wat ook al ten einde resultate te genereer.

Na 'n soektog uitdrukking gee twee voordele.

Die eerste voordeel is optimalisering. Omdat wysigers soos "Waar 'is opgeneem in die soektog uitdrukking, kan die IQueryProvider anders onmoontlik optimalisaties toe te pas. In plaas van die terugkeer van al die elemente dan weggooi meeste van hulle as gevolg van 'n "Waar 'klousule, kan die verskaffer 'n hash tafel gebruik om items te vind met 'n gegewe sleutel.

Die tweede voordeel is buigsaamheid. Omdat Expressions is explorable datastrukture, kan jy dinge soos afleveringen doen die navraag en stuur dit na 'n afgeleë masjien (bv. LinQ-tot-sql).

IQueriable is dieselfde as IEnumerable maar dit bied ook bykomende funksies te gebruik implementeer bevraagteken met Linq. Hier is beskrywing op MSDN: http://msdn.microsoft. com / af-ons / library / system.linq.iqueryable.aspx

In die eerste plek IEnumerable gevind in 'n System.Collections Naamruimte terwyl die IQueryable gevind in 'n System.Linq Naamruimte. As jy gebruik IEnumerable wanneer bevraagteken data uit in-geheue versamelings soos List, Array versameling ens En wanneer bevraagteken data van out-geheue (soos remote databasis, diens) versamelings so jy gebruik IQueryable. Omdat Terwyl bevraagteken data uit die databasis, IEnumerable voer kies navraag op die bediener kant, vrag data in-geheue op die kliënt kant en dan filter data. Vandaar doen meer werk en word stadig. Terwyl die gebruik daarvan data uit die databasis, IQueryable voer kies navraag op die bediener kant met alle filters. Vandaar doen minder werk en raak vinnig.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top