Språkintegrerad fråga (LINQ)
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 kompilering eller stöd för IntelliSense. Dessutom måste du lära dig olika 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.
För en utvecklare som skriver frågor är den mest synliga "språkintegrerade" delen av LINQ frågeuttrycket. Frågeuttryck skrivs i en deklarativ frågesyntax. Genom att använda frågesyntax kan du utföra filtrerings-, ordnings- och grupperingsåtgärder på datakällor med ett minimum av kod. Du använder samma grundläggande frågeuttrycksmönster för att fråga efter och transformera data i SQL databaser, ADO .NET-datauppsättningar, XML-dokument och strömmar samt .NET-samlingar.
I följande exempel visas den fullständiga frågeåtgärden. 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 (int i in scoreQuery)
{
Console.Write(i + " ");
}
// Output: 97 92 81
Översikt över frågeuttryck
Frågeuttryck kan användas för att fråga och transformera 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 är lätta att förstå eftersom de använder många välbekanta C#-språkkonstruktioner.
Variablerna i ett frågeuttryck är alla starkt typifierade, men i många fall behöver du inte ange typen explicit eftersom kompilatorn kan härleda den. Mer information finns i Type relationships in LINQ query operations (Typrelationer i LINQ-frågeåtgärder).
En fråga körs inte förrän du itererar över frågevariabeln, till exempel i en
foreach
-instruktion. Mer information finns i Introduktion till LINQ-frågor.Vid kompilering konverteras frågeuttryck till Standard Query Operator-metodanrop enligt de regler som anges i C#-specifikationen. Alla frågor som kan uttryckas med hjälp av frågesyntax kan också uttryckas med hjälp av metodsyntax. I de flesta fall är dock frågesyntaxen mer läsbar och koncis. Mer information finns i Översikt över C#-språkspecifikation och Standard-frågeoperatorer.
Som regel när du skriver LINQ-frågor rekommenderar vi att du använder frågesyntax när det är möjligt och metodsyntax när det behövs. Det finns ingen semantisk eller prestandaskillnad mellan de två olika formulären. Frågeuttryck är ofta mer läsbara än motsvarande uttryck som skrivits i metodsyntax.
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. Mer information finns i Frågesyntax och metodsyntax i LINQ.
Frågeuttryck kan kompileras till uttrycksträd eller till ombud, beroende på vilken typ frågan tillämpas på. IEnumerable<T> frågor kompileras till ombud. IQueryable och IQueryable<T> frågor kompileras till uttrycksträd. Mer information finns i Uttrycksträd.
Nästa steg
Om du vill veta mer om LINQ kan du börja med att bekanta dig med några grundläggande begrepp i grunderna för frågeuttryck och sedan läsa dokumentationen för LINQ-tekniken som du är intresserad av:
XML-dokument: LINQ to XML
ADO.NET Entity Framework: LINQ till entiteter
.NET-samlingar, filer, strängar och så vidare: LINQ till objekt
Mer information om LINQ i allmänhet finns i LINQ i C#.
Om du vill börja arbeta med LINQ i C# kan du läsa självstudien Arbeta med LINQ.