Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Language-Integrated Query (LINQ) är namnet på en uppsättning tekniker baserat på integreringen av frågefunktioner direkt i C#-språket. Traditionellt uttrycks frågor mot data som enkla strängar utan typkontroll vid kompileringstid eller IntelliSense-stöd. Dessutom måste du lära dig ett annat frågespråk för varje typ av datakälla: SQL-databaser, XML-dokument, olika webbtjänster och så vidare. Med LINQ är en fråga en förstklassig språkkonstruktion, precis som klasser, metoder och händelser.
När du skriver frågor är den mest synliga "språkintegrerade" delen av LINQ frågeuttrycket. Frågeuttryck skrivs i en deklarativ frågesyntax. Med hjälp av frågesyntax utför du filtrerings-, beställnings- och grupperingsåtgärder på datakällor med minst kod. Du använder samma frågeuttrycksmönster för att fråga efter och transformera data från alla typer av datakällor.
I följande exempel visas en fullständig frågeåtgärd. Den fullständiga åtgärden omfattar att skapa en datakälla, definiera frågeuttrycket och köra frågan i en foreach
-instruktion.
// Specify the data source.
int[] scores = [97, 92, 81, 60];
// Define the query expression.
IEnumerable<int> scoreQuery =
from score in scores
where score > 80
select score;
// Execute the query.
foreach (var i in scoreQuery)
{
Console.Write(i + " ");
}
// Output: 97 92 81
Du kan behöva lägga till ett using
direktiv, using System.Linq;
, för att föregående exempel ska kompileras. De senaste versionerna av .NET använder implicita användningsområden för att lägga till det här direktivet som en global användning. Äldre versioner kräver att du lägger till den i källan.
Översikt över frågeuttryck
- Frågeuttryck frågar efter och transformerar data från alla LINQ-aktiverade datakällor. En enskild fråga kan till exempel hämta data från en SQL-databas och skapa en XML-dataström som utdata.
- Frågeuttryck använder många välbekanta C#-språkkonstruktioner, vilket gör dem enkla att läsa.
- Variablerna i ett frågeuttryck är alla starkt typade.
- En fråga körs inte förrän du itererar över frågevariabeln, till exempel i en
foreach
-instruktion. - Vid kompileringstillfället konverteras frågeuttryck till standardmetodanrop för frågeoperatorer enligt de regler som definieras i C#-specifikationen. Alla frågor som kan uttryckas med hjälp av frågesyntax kan också uttryckas med hjälp av metodsyntax. I vissa fall är frågesyntaxen mer läsbar och koncis. I andra fall är metodsyntaxen mer läsbar. Det finns ingen semantisk eller prestandaskillnad mellan de två olika formulären. Mer information finns i Översikt över C#-språkspecifikationer och Standard-frågeoperatorer.
- Vissa frågeåtgärder, till exempel Count eller Max, har ingen motsvarande frågeuttryckssats och måste därför uttryckas som ett metodanrop. Metodsyntax kan kombineras med frågesyntax på olika sätt.
- Frågeuttryck kan kompileras till uttrycksträd eller till delegater, beroende på vilken typ av objekt frågan tillämpas på. IEnumerable<T> förfrågningar kompileras till delegater. IQueryable och IQueryable<T> frågor kompileras till uttrycksträd. Mer information finns i Uttrycksträd.
Så här aktiverar du LINQ-frågor för din datakälla
Data i minnet
Det finns två sätt att aktivera LINQ-frågor för minnesintern data. Om data är av en typ som implementerar IEnumerable<T>, du ställer frågor till data med hjälp av LINQ to Objects. Om det inte är meningsfullt att aktivera uppräkning genom att implementera gränssnittet definierar du LINQ-standardmetoder för frågeoperatorer, antingen i den typen eller som IEnumerable<T> för den 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.
IQueryable LINQ-leverantörer
LINQ-leverantörer som implementerar IQueryable<T> kan variera mycket i deras komplexitet.
En mindre komplex tjänsteleverantör kan komma åt en enda metod från 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 genom att använda implementeringarna av Enumerable 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 komma åt mer än en metod för webbtjänsten och välja vilken metod som ska anropas baserat på den information som frågan söker efter. 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 navigeras, men tillhandahåller inte mappningsteknik för användardefinierade typer.
En komplex IQueryable
provider, till exempel Entity Framework Core-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 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.