Sdílet prostřednictvím


Psaní prvního LINQ dotazu (Visual Basic)

A dotaz je výraz, který načítá data ze zdroje dat.Dotazy jsou vyjádřeny v vyhrazené dotazovací jazyk.V průběhu času různými jazyky byly vyvinuty pro různé typy zdrojů dat, například SQL pro relační databáze a XQuery pro XML.Proto je nutné pro vývojáře aplikace naučit nový dotazovací jazyk pro každý typ zdroje dat nebo formát dat, který je podporován.

LINQ (Language-Integrated Query)zjednodušuje situace tím, že nabízí konzistentní model pro práci s daty přes různé druhy datových zdrojích a formátech.V LINQ dotazu, vždy práci s objekty.Použít stejné základní kódování vzory k dotazování a transformovat data v dokumentech XML, databáze SQL, datové sady ADO.NET a entity, kolekcí rozhraní.NET Framework a jiné zdroje ani formát pro kterou LINQ poskytovatele je k dispozici.Tento dokument popisuje tři fáze vytváření a využívání basic LINQ dotazy.

odkaz na video Související video ukázku naleznete v jak udělat i seznámení s technologií LINQ?.

Tři fáze operace dotazu

LINQoperace dotazu se skládá ze tří akcí:

  1. Získání zdroje nebo zdroje.

  2. Vytvoření dotazu.

  3. Spuštění dotazu.

V LINQ, spuštění dotazu se liší od vytvoření dotazu.Právě vytvořením dotazu není načte všechna data.Tento bod je popsán podrobněji dále v tomto tématu.

Následující příklad ukazuje tři části operace dotazu.Příklad používá pole celých čísel jako vhodná datová zdroj pro demonstrační účely.Koncepty však také použít k jiným zdrojům dat.

[!POZNÁMKA]

Na Kompilace stránky projektu Designer (Visual Basic), aby Option infer je nastavena na na.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

Výstup:

0 2 4 6

Zdroj dat

Protože zdroj dat v předchozím příkladu je polem, implicitně podporuje obecného IEnumerable<T> rozhraní.Je tato skutečnost, že vám umožní použít jako zdroj dat pro pole LINQ dotazu.Typy, které podporují IEnumerable<T> nebo odvozené rozhraní, jako je například obecného IQueryable<T> , se nazývají dotazovatelný typy.

Implicitně dotazovatelný typ, pole vyžaduje žádné změny nebo zvláštní zacházení jako LINQ zdroje dat.Totéž platí pro jakýkoli typ kolekce, která podporuje IEnumerable<T>, včetně obecného List<T>, Dictionary<TKey, TValue>a jiných tříd v knihovně tříd rozhraní.NET Framework.

Pokud zdrojová data již neimplementuje IEnumerable<T>, LINQ zprostředkovatele je potřebné k implementaci funkcí standardních dotazových operátorů pro tento zdroj.Například Technologie LINQ to XML zpracovává načítání dokumentu XML dotazovatelný práce XElement zadejte, jak je znázorněno v následujícím příkladu.Další informace o standardních dotazových operátorů, viz Přehled operátorů standardní dotaz.

' Create a data source from an XML document.
Dim contacts = XElement.Load("c:\myContactList.xml")

S Technologie LINQ to SQL, nejprve vytvořit objektově relační mapování v době návrhu, buď ručně nebo pomocí Object Relational Designer (O/R Designer).Psát své dotazy, proti objekty a v době běhu Technologie LINQ to SQL zpracovává komunikaci s databází.V následujícím příkladu customers představuje určité tabulky v databázi, a Table<TEntity> podporuje obecný IQueryable<T>.

' Create a data source from a SQL table.
Dim db As New DataContext("C:\Northwind\Northwnd.mdf")
Dim customers As Table(Of Customer) = db.GetTable(Of Customer)

Další informace o vytváření určitých typů zdrojů dat naleznete v dokumentaci k různým LINQ poskytovatelů.(Seznam těchto zprostředkovatelů naleznete v tématu LINQ (integrován jazyk dotazu).) Základním pravidlem je jednoduchý: LINQ zdroj dat je libovolný objekt, který podporuje obecného IEnumerable<T> rozhraní nebo rozhraní, které dědí z něj.

[!POZNÁMKA]

Typy, jako je například ArrayList podporující neobecnou IEnumerable rozhraní mohou také sloužit jako LINQ zdroje dat.Příklad, který používá ArrayList, viz Jak: dotaz ArrayList s LINQ.

Dotaz

V dotazu určete, jaké informace chcete získat ze zdroje dat nebo zdroje.Také máte možnost určit, jak tyto informace by měla být seřazeny, seskupeny nebo strukturované dříve, než je vrácena.Chcete-li povolit vytváření dotazu, doplnil Visual Basic nové syntaxe dotazu jazyk.

Při spuštění, vrátí dotaz v následujícím příkladu sudá čísla z pole celé číslo, numbers.

' Data source.
Dim numbers() As Integer = {0, 1, 2, 3, 4, 5, 6}

' Query creation.
Dim evensQuery = From num In numbers
                 Where num Mod 2 = 0
                 Select num

' Query execution.
For Each number In evensQuery
    Console.Write(number & " ")
Next

Výraz dotazu obsahuje tři klauzule: From, Where, a Select.Specifické funkce a účel každé klauzule výraz dotazu je popsán v Základní operace dotazu (Visual Basic).Další informace naleznete v tématu Dotazy (Visual Basic).Všimněte si, že v LINQ, definice dotazu často je uložena v proměnné a proveden později.Dotaz proměnné, jako například evensQuery v předchozím příkladu musí být dotazovatelný typ. Typ evensQuery je IEnumerable(Of Integer), přiřazené pomocí kompilátoru, pomocí odvození typu místní.

Je důležité si uvědomit, že proměnné v dotazu samotném neprovede žádnou akci a vrátí žádná data.Ukládá pouze definici dotazu.V předchozím příkladu je For Each smyčky, která provede dotaz.

Provádění dotazu

Provádění dotazu je oddělen od vytvoření dotazu.Vytvoření dotazu definuje dotazu, ale provedení je aktivován jiný mechanismus.Dotaz mohou být provedeny co nejdříve, dokud je definován (okamžité provedení), nebo mohou být uloženy definice a dotazu mohou být provedeny později (odložené provedení).

Bb384667.collapse_all(cs-cz,VS.110).gifOdložené provedení

Typické LINQ dotaz bude vypadat jako v předchozím příkladu, ve kterém evensQuery je definován.Vytvoří dotaz, ale nespustí se okamžitě.Místo toho je definice dotazu uložené v proměnné dotazu evensQuery.Provést dotaz později, obvykle pomocí For Each smyčky, která vrací posloupnost hodnot nebo použitím standardního dotazovacího operátoru Count nebo Max.Tento proces se nazývá odložené provedení.

' Query execution that results in a sequence of values.
For Each number In evensQuery
    Console.Write(number & " ")
Next

' Query execution that results in a single value.
Dim evens = evensQuery.Count()

Pro posloupnost hodnot přistupujete pomocí iterační proměnná v načtená data For Each smyčky (number v předchozím příkladu).Protože proměnná dotazu evensQuery, obsahuje definici dotazu, nikoli výsledky dotazu je spuštěn dotaz podle potřeby s použitím proměnné v dotazu více než jednou.Například může mít databáze v aplikaci, která je neustále aktualizován v samostatné aplikaci.Poté, co jste vytvořili dotaz, který načítá data z databáze, můžete použít For Each smyčka opakovaně spouštět dotaz načítání nejaktuálnější data při každém.

Následující příklad ukazuje, jak odložené provedení funguje.Po evensQuery2 definované a provádí se For Each smyčce, stejně jako v předchozích příkladech některé prvky zdroje dat numbers se změní.Pak druhé For Each smyčka spuštěna evensQuery2 znovu.Výsledky jsou jiné podruhé, protože For Each smyčky spustí dotaz znovu pomocí nových hodnot v numbers.

Dim numberArray() = {0, 1, 2, 3, 4, 5, 6}

Dim evensQuery2 = From num In numberArray
                  Where num Mod 2 = 0
                  Select num

Console.WriteLine("Evens in original array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

' Change a few array elements.
numberArray(1) = 10
numberArray(4) = 22
numberArray(6) = 8

' Run the same query again.
Console.WriteLine(vbCrLf & "Evens in changed array:")
For Each number In evensQuery2
    Console.Write("  " & number)
Next
Console.WriteLine()

Výstup:

Evens in original array:

0 2 4 6

Evens in changed array:

0 10 2 22 8

Bb384667.collapse_all(cs-cz,VS.110).gifOkamžité spuštění

Odložené spuštění dotazů definice dotazu uložena v proměnné dotazu na pozdější dobu.Okamžité spuštění bude dotaz proveden v době jeho definici.Spuštění, bude spuštěna při použití metody, která vyžaduje přístup k jednotlivým prvkům výsledek dotazu.Okamžité provedení často je vynuceno pomocí jednoho ze standardních operátorů pro dotazování, které vracejí jednotlivé hodnoty.Examples are Count, Max, Average, and First.Těchto standardních dotazovacích operátorů provést dotaz ihned poté, co jsou použity pro výpočet a vrácení výsledku singleton.Další informace o standardních operátorů pro dotazování, které vracejí jednotlivé hodnoty naleznete v Agregace operací, Prvek operace, a Kvantifikátor operací.

Následující dotaz vrátí počet sudá čísla do pole celých čísel.Definice dotazu nebude uložena, a numEvens je jednoduchý Integer.

Dim numEvens = (From num In numbers
                Where num Mod 2 = 0
                Select num).Count()

Stejného výsledku lze dosáhnout pomocí Aggregate metoda.

Dim numEvensAgg = Aggregate num In numbers
                  Where num Mod 2 = 0
                  Select num
                  Into Count()

Můžete vynutit spuštění dotazu voláním ToList nebo ToArray metoda na dotaz (okamžité) nebo proměnné dotazu (odložené), jak je znázorněno v následujícím kódu.

' Immediate execution.
Dim evensList = (From num In numbers
                 Where num Mod 2 = 0
                 Select num).ToList()

' Deferred execution.
Dim evensQuery3 = From num In numbers
                  Where num Mod 2 = 0
                  Select num
' . . .
Dim evensArray = evensQuery3.ToArray()

V předchozích příkladech evensQuery3 je dotaz proměnné, ale evensList seznam a evensArray je pole.

Pomocí ToList nebo ToArray Chcete-li vynutit okamžité spuštění je zvláště užitečné v situacích, ve kterých má být okamžitě provést dotaz a výsledky v jedné kolekci objektů do mezipaměti.Další informace o těchto metodách naleznete v tématu Převod datových typů.

Může také způsobit dotazu má být proveden pomocí IEnumerable metodu, jako IEnumerable.GetEnumerator metoda.

Související Video ukázky

Jak i seznámení s technologií LINQ?

Video jak: písemné dotazy v jazyce Visual Basic

Viz také

Úkoly

Vzorky LINQ

Koncepty

O/R Designer Overview

Místní odvození typu (Visual Basic)

Přehled operátorů standardní dotaz

Úvod do jazyka Visual Basic LINQ

Další zdroje

Začínáme s LINQ v jazyce Visual Basic

LINQ v jazyce Visual Basic

Dotazy (Visual Basic)