Dela via


LINQ till entiteter

LINQ till entiteter tillhandahåller stöd för språkintegrerad fråga (LINQ) som gör det möjligt för utvecklare att skriva frågor mot Entity Framework-konceptmodellen med visualiseringsmodellen Basic eller Visual C#. Frågor mot Entity Framework representeras av kommandoträdsfrågor som körs mot objektkontexten. LINQ till entiteter konverterar LINQ-frågor (Language-Integrated Queries) till kommandoträdsfrågor, kör frågorna mot Entity Framework och returnerar objekt som kan användas av både Entity Framework och LINQ. Följande är processen för att skapa och köra en LINQ till entitetsfråga:

  1. Konstruera en ObjectQuery<T> instans från ObjectContext.

  2. Skapa en LINQ till entitetsfråga i C# eller Visual Basic med hjälp av instansen ObjectQuery<T> .

  3. Konvertera LINQ-standardfrågeoperatorer och -uttryck till kommandoträd.

  4. Kör frågan i kommandoträdsrepresentationen mot datakällan. Eventuella undantag som utlöses på datakällan under körningen skickas direkt upp till klienten.

  5. Returnera frågeresultatet tillbaka till klienten.

Skapa en ObjectQuery-instans

Den ObjectQuery<T> generiska klassen representerar en fråga som returnerar en samling med noll eller fler inskrivna entiteter. En objektfråga konstrueras vanligtvis från en befintlig objektkontext, i stället för att konstrueras manuellt och tillhör alltid objektkontexten. Den här kontexten innehåller den anslutningsinformation och metadatainformation som krävs för att skriva och köra frågan. Den ObjectQuery<T> generiska klassen implementerar det IQueryable<T> generiska gränssnittet, vars byggmetoder gör att LINQ-frågor kan skapas stegvis. Du kan också låta kompilatorn härleda typen av entiteter med hjälp av nyckelordet C# var (Dim i Visual Basic, med lokal typinferens aktiverad).

Skriva frågorna

Instanser av den ObjectQuery<T> generiska klassen, som implementerar det generiska IQueryable<T> gränssnittet, fungerar som datakälla för LINQ till entitetsfrågor. I en fråga anger du exakt den information som du vill hämta från datakällan. En fråga kan också ange hur den informationen ska sorteras, grupperas och formas innan den returneras. I LINQ lagras en fråga i en variabel. Den här frågevariabeln vidtar ingen åtgärd och returnerar inga data. den lagrar bara frågeinformationen. När du har skapat en fråga måste du köra frågan för att hämta data.

LINQ till entitetsfrågor kan bestå av två olika syntaxer: frågeuttryckssyntax och metodbaserad frågesyntax. Frågeuttryckssyntax och metodbaserad frågesyntax är nya i C# 3.0 och Visual Basic 9.0.

Mer information finns i Frågor i LINQ till entiteter.

Frågekonvertering

För att köra en LINQ-till-entitetsfråga mot Entity Framework måste LINQ-frågan konverteras till en kommandoträdsrepresentation som kan köras mot Entity Framework.

LINQ till entitetsfrågor består av LINQ-standardfrågeoperatorer (till exempel Select, Whereoch GroupBy) och uttryck (x > 10, Contact.LastName och så vidare). LINQ-operatorer definieras inte av en klass, utan är snarare metoder för en klass. I LINQ kan uttryck innehålla allt som tillåts av typer inom System.Linq.Expressions namnområdet och i tillägg allt som kan representeras i en lambda-funktion. Detta är en supermängd av de uttryck som tillåts av Entity Framework, som per definition är begränsade till åtgärder som tillåts i databasen och stöds av ObjectQuery<T>.

I Entity Framework representeras både operatorer och uttryck av en enda typhierarki, som sedan placeras i ett kommandoträd. Kommandoträdet används av Entity Framework för att köra frågan. Om LINQ-frågan inte kan uttryckas som ett kommandoträd utlöses ett undantag när frågan konverteras. Konverteringen av LINQ till entitetsfrågor omfattar två underkonverteringar: konverteringen av standardfrågeoperatorerna och konverteringen av uttrycken.

Det finns ett antal LINQ-standardfrågeoperatorer som inte har någon giltig översättning i LINQ till entiteter. Försök att använda dessa operatorer resulterar i ett undantag vid frågeöversättning. En lista över LINQ till entitetsoperatorer som stöds finns i LINQ-metoder som stöds och som inte stöds (LINQ till entiteter).

Mer information om hur du använder standardfrågeoperatorerna i LINQ till entiteter finns i Standard Query Operators in LINQ to Entities Queries (Standard Query Operators in LINQ to Entities Querys).

I allmänhet utvärderas uttryck i LINQ till entiteter på servern, så uttryckets beteende bör inte förväntas följa CLR-semantik. Mer information finns i Uttryck i LINQ till entitetsfrågor.

Information om hur CLR-metodanrop mappas till kanoniska funktioner i datakällan finns i CLR-metoden till kanonisk funktionsmappning.

Information om hur du anropar kanoniska funktioner, databaser och anpassade funktioner från LINQ till entitetsfrågor finns i Anropa funktioner i LINQ till entitetsfrågor.

Frågekörning

När LINQ-frågan har skapats av användaren konverteras den till en representation som är kompatibel med Entity Framework (i form av kommandoträd), som sedan körs mot datakällan. Vid frågekörningen utvärderas alla frågeuttryck (eller komponenter i frågan) på klienten eller på servern. Detta inkluderar uttryck som används i resultatmaterialisering eller entitetsprojektioner. Mer information finns i Frågekörning. Information om hur du förbättrar prestanda genom att kompilera en fråga en gång och sedan köra den flera gånger med olika parametrar finns i Kompilerade frågor (LINQ till entiteter).

Materialisering

Materialisering är processen för att returnera frågeresultat tillbaka till klienten som CLR-typer. I LINQ till entiteter returneras aldrig dataposter för frågeresultat. det finns alltid en säkerhetskopierande CLR-typ som definieras av användaren eller av Entity Framework eller genereras av kompilatorn (anonyma typer). All objektmaterialisering utförs av Entity Framework. Eventuella fel som beror på en oförmåga att mappa mellan Entity Framework och CLR orsakar undantag som utlöses under objektmaterialisering.

Frågeresultat returneras vanligtvis som något av följande:

  • En samling med noll eller fler typinskrivna entitetsobjekt eller en projektion av komplexa typer som definierats i den konceptuella modellen.

  • CLR-typer som stöds av Entity Framework.

  • Infogade samlingar.

  • Anonyma typer.

Mer information finns i Frågeresultat.

I det här avsnittet

Frågor i LINQ till entiteter

Uttryck i LINQ till entitetsfrågor

Anropa funktioner i LINQ till entitetsfrågor

Kompilerade frågor (LINQ till entiteter)

Frågekörning

Frågeresultat

Vanliga frågeoperatorer i LINQ till entitetsfrågor

CLR-metod till kanonisk funktionsmappning

LINQ-metoder som stöds och som inte stöds (LINQ till entiteter)

Kända problem och överväganden i LINQ till entiteter

Se även