C# Academy · leksjon

Uttrykkstrær i LINQ-leverandører

Se hvordan leverandører oversetter uttrykk til spørringer.

Leksjon 4 av 413 trinn

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,4

Spø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")); // True

Oversettelse, 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,40

Sette 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,25

Det 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,4

Hurtigsjekk

Bekreft hvilken rolle uttrykkstreer spiller for LINQ-leverandører.

Oppsummering

De har lært hvordan LINQ-leverandører bruker uttrykkstreer.

  • IEnumerable bruker kompilert Func; IQueryable bruker Expression<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.
Gratis å komme i gang

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

  1. Hva er uttrykkstrær
  2. Bygge uttrykk manuelt
  3. Kompilere og kjøre uttrykk
  4. Uttrykkstrær i LINQ-leverandører
← Tilbake til C# Academy