Dela via


Aktivera en datakälla för LINQ-frågor (Visual Basic)

Det finns olika sätt att utöka LINQ så att alla datakällor kan efterfrågas i LINQ-mönstret. Datakällan kan vara en datastruktur, en webbtjänst, ett filsystem eller en databas för att namnge vissa. LINQ-mönstret gör det enkelt för klienter att fråga en datakälla som LINQ-frågor är aktiverade för, eftersom syntaxen och mönstret för frågan inte ändras. De sätt på vilka LINQ kan utökas till dessa datakällor är bland annat följande:

  • IEnumerable<T> Implementera gränssnittet i en typ för att aktivera LINQ till objekt som frågar av den typen.

  • Skapa standardmetoder för frågeoperatorer, till exempel Where och Select som utökar en typ, för att aktivera anpassad LINQ-fråga av den typen.

  • Skapa en provider för din datakälla som implementerar IQueryable<T> gränssnittet. En provider som implementerar det här gränssnittet tar emot LINQ-frågor i form av uttrycksträd, som kan köras på ett anpassat sätt, till exempel via fjärranslutning.

  • Skapa en leverantör för din datakälla som utnyttjar en befintlig LINQ-teknik. En sådan provider skulle inte bara aktivera frågekörning, utan även infoga, uppdatera och ta bort åtgärder och mappning för användardefinierade typer.

I det här avsnittet beskrivs de här alternativen.

Så här aktiverar du LINQ-frågor för din datakälla

Minnesintern data

Det finns två sätt att aktivera LINQ-frågor om minnesintern data. Om data är av en typ som implementerar IEnumerable<T>kan du köra frågor mot data med hjälp av LINQ till Objekt. Om det inte är meningsfullt att aktivera uppräkning av din typ genom att implementera IEnumerable<T> gränssnittet kan du definiera LINQ-standardmetoder för frågeoperatorer i den typen eller skapa LINQ-standardmetoder för frågeoperatorer som utökar typen. Anpassade implementeringar av standardfrågeoperatorerna bör använda uppskjuten körning för att returnera resultatet.

Fjärrdata

Det bästa alternativet för att aktivera LINQ-frågor för en fjärrdatakälla är att implementera IQueryable<T> gränssnittet. Detta skiljer sig dock från att utöka en provider som LINQ till SQL för en datakälla. Det finns inga providermodeller för att utöka befintliga LINQ-tekniker, till exempel LINQ till SQL, till andra typer av datakällor i Visual Studio 2008.

IQueryable LINQ-providers

LINQ-leverantörer som implementerar IQueryable<T> kan variera mycket i deras komplexitet. I det här avsnittet beskrivs de olika komplexitetsnivåerna.

En mindre komplex IQueryable provider kan samverka med en enda metod för en webbtjänst. Den här typen av provider är mycket specifik eftersom den förväntar sig specifik information i de frågor som den hanterar. Den har ett system av sluten typ som kanske exponerar en enda resultattyp. Merparten av körningen av frågan sker lokalt, till exempel med hjälp Enumerable av implementeringarna av standardfrågeoperatorerna. En mindre komplex provider kan bara undersöka ett metodanropsuttryck i uttrycksträdet som representerar frågan och låta den återstående logiken i frågan hanteras någon annanstans.

En IQueryable provider med medelhög komplexitet kan rikta in sig på en datakälla som har ett delvis uttrycksfullt frågespråk. Om den riktar sig mot en webbtjänst kan den samverka med mer än en metod för webbtjänsten och välja den metod som ska anropas baserat på frågan som frågan ställer. En leverantör med medelhög komplexitet skulle ha ett rikare typsystem än en enkel leverantör, men det skulle fortfarande vara ett system av fast typ. Providern kan till exempel exponera typer som har en-till-många-relationer som kan passeras, men som inte tillhandahåller mappningsteknik för användardefinierade typer.

En komplex IQueryable provider, till exempel LINQ till SQL-providern, kan översätta fullständiga LINQ-frågor till ett uttrycksfullt frågespråk, till exempel SQL. En komplex provider är mer allmän än en mindre komplex provider, eftersom den kan hantera en bredare mängd frågor i frågan. Det har också ett öppet typsystem och måste därför innehålla omfattande infrastruktur för att mappa användardefinierade typer. Det krävs mycket arbete för att utveckla en komplex leverantör.

Se även