Uttrykkstrær i LINQ-leverandører
Se hvordan leverandører oversetter uttrykk til spørringer.
Uttrykkstrær i LINQ-leverandører er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.
Hvorfor LINQ trenger uttrykkstreer
LINQ har to varianter. IEnumerable<T> kjører lambdaer i minnet. IQueryable<T> mottar dem som uttrykkstreer, slik at en leverandør kan oversette dem til et annet språk, for eksempel SQL.
IEnumerable kontra IQueryable
Forskjellen ligger i parametertypen: IEnumerable.Where tar Func<T,bool> (kompilert), mens IQueryable.Where tar Expression<Func<T,bool>> (et tre).
using System;
using System.Linq;
using System.Linq.Expressions;
int[] nums = { 1, 2, 3, 4 };
// IEnumerable path: lambda is a compiled delegate
var evens = nums.Where(n => n % 2 == 0);
Console.WriteLine(string.Join(",", evens)); // 2,4Spørringen forblir data
Med IQueryable fanges lambdaen Deres opp som et uttrykkstre og kjøres ikke ennå. Leverandøren inspiserer treet for å bygge en spørring.
using System;
using System.Linq;
using System.Linq.Expressions;
IQueryable<int> q = new[] { 1, 2, 3, 4, 5 }.AsQueryable();
var filtered = q.Where(n => n > 2);
Console.WriteLine(filtered.Expression.NodeType); // Call (a method-call tree)Inspisere et spørringsuttrykk
Egenskapen Expression på et spørringsobjekt viser treet leverandøren skal oversette.
using System;
using System.Linq;
var q = new[] { 10, 20, 30 }.AsQueryable().Where(x => x >= 20);
Console.WriteLine(q.Expression.ToString().Contains("Where")); // TrueOversettelse, ikke kjøring
En leverandør som Entity Framework går gjennom treet og genererer SQL, for eksempel WHERE Age > 18. C#-predikatet Deres kjøres aldri på klienten; databasen utfører arbeidet.
Rollen til IQueryProvider
IQueryable inneholder en IQueryProvider. Når De itererer gjennom spørringen, mottar leverandøren uttrykkstreet og avgjør hvordan det skal kjøres.
using System;
using System.Linq;
var q = new[] { 1, 2, 3 }.AsQueryable();
Console.WriteLine(q.Provider.GetType().Name); // EnumerableQuery (the in-memory provider)Utsatt kjøring
Treet oversettes og kjøres først når De itererer gjennom det, for eksempel med ToList eller foreach. Frem til da er det rene data De kan fortsette å sette sammen.
using System;
using System.Linq;
var q = new[] { 1, 2, 3, 4 }.AsQueryable()
.Where(n => n > 1)
.Select(n => n * 10);
// nothing has run yet; now force it:
Console.WriteLine(string.Join(",", q.ToList())); // 20,30,40Sette sammen spørringer
Fordi hver operator legger til noe i uttrykkstreet, kan De bygge en spørring trinnvis, og leverandøren ser helheten når spørringen kjøres.
using System;
using System.Linq;
var baseQuery = new[] { 5, 15, 25, 35 }.AsQueryable();
var q = baseQuery.Where(n => n > 10);
q = q.Where(n => n < 30); // composed: 10 < n < 30
Console.WriteLine(string.Join(",", q.ToList())); // 15,25Det som ikke kan oversettes
Leverandører kan bare oversette operasjoner de forstår. Et predikat som kaller en vilkårlig C#-metode, kan utløse et unntak ved kjøring fordi det ikke finnes noe tilsvarende i SQL.
Skrive Deres egen leverandør
Egendefinerte leverandører implementerer IQueryProvider og bruker en ExpressionVisitor til å gå gjennom treet og oversette hver node til leverandørens spørringsspråk.
Slik henger det sammen
Dette viser hovedpoenget: Den samme lambdaen er en delegat for IEnumerable, men et tre for IQueryable, noe som muliggjør oversettelse.
using System;
using System.Linq;
using System.Linq.Expressions;
Expression<Func<int, bool>> predicate = n => n > 2;
var data = new[] { 1, 2, 3, 4 };
// IEnumerable needs a delegate:
Console.WriteLine(string.Join(",", data.Where(predicate.Compile()))); // 3,4
// IQueryable accepts the tree directly:
Console.WriteLine(string.Join(",", data.AsQueryable().Where(predicate))); // 3,4Hurtigsjekk
Bekreft hvilken rolle uttrykkstreer spiller for LINQ-leverandører.
Oppsummering
De har lært hvordan LINQ-leverandører bruker uttrykkstreer.
IEnumerablebruker kompilertFunc;IQueryablebrukerExpression<Func>-trær.- Leverandører oversetter treet, for eksempel til SQL, i stedet for å kjøre det.
- Kjøringen utsettes til spørringen blir enumerert.
- Bare operasjoner som kan oversettes, fungerer; vilkårlige metoder kan mislykkes.
Lær deg C# med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 93
- Leksjoner
- 346
Ofte stilte spørsmål
Er leksjonen «Uttrykkstrær i LINQ-leverandører» gratis?
Ja – hele teksten i «Uttrykkstrær i LINQ-leverandører» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Uttrykkstrær i LINQ-leverandører»?
Se hvordan leverandører oversetter uttrykk til spørringer. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C# Academy?
Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Uttrykkstrær i LINQ-leverandører»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?
Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Hva er uttrykkstrær
- Bygge uttrykk manuelt
- Kompilere og kjøre uttrykk
- Uttrykkstrær i LINQ-leverandører