Sdílet prostřednictvím


Představení technologie LINQ v jazyce Visual Basic

Funkce Language-Integrated Query (LINQ) přidává produktu Visual Basic možnost používat dotazy a při práci se všemi druhy dat poskytuje jednoduché a výkonné možnosti.Místo odeslání dotazu do databáze ke zpracování nebo práce s různou syntaxí dotazu pro každý typ hledaných dat, představuje LINQ dotazy jako součást jazyka Visual Basic.Používá jednotný syntax bez ohledu na typ dat.

LINQ umožňuje zadat dotaz na data z databáze serveru SQL Server, XML, polí v paměti a kolekcí, datových sad ADO.NET nebo jiných vzdálených nebo místních zdrojů dat podporujících LINQ.To vše lze provést všechny se společnými elementy jazyka Visual Basic.Vzhledem k tomu, že jsou vaše dotazy napsány v jazyce Visual Basic výsledky vašich dotazů jsou vraceny jako silně typované objekty.Tyto objekty podporují technologii IntelliSense, která umožňuje psát kód rychleji a zachytit chyby při kompilaci dotazů místo za běhu.Dotazy LINQ lze použít jako zdroj dalších dotazů pro upřesnění výsledků.Mohou také být vázány na ovládací prvky, takže uživatelé mohou snadno zobrazit a upravit výsledky dotazu.

Například následující příklad kódu ukazuje dotaz LINQ, který vrátí seznam zákazníků z kolekce a seskupí je na základě jejich umístění.

' Obtain a list of customers. 
Dim customers As List(Of Customer) = GetCustomers()

' Return customers that are grouped based on country. 
Dim countries = From cust In customers
                Order By cust.Country, cust.City
                Group By CountryName = cust.Country
                Into CustomersInCountry = Group, Count()
                Order By CountryName

' Output the results. 
For Each country In countries
    Debug.WriteLine(country.CountryName & " count=" & country.Count)

    For Each customer In country.CustomersInCountry
        Debug.WriteLine("   " & customer.CompanyName & "  " & customer.City)
    Next 
Next 

' Output: 
'   Canada count=2 
'      Contoso, Ltd  Halifax 
'      Fabrikam, Inc.  Vancouver 
'   United States count=1 
'      Margie's Travel  Redmond

V tomto tématu naleznete informace o následujících tématech:

  • Spuštění příkladů

  • Poskytovatelé LINQ

  • Struktura dotazu LINQ

  • Operátory dotazů LINQ jazyka Visual Basic

  • Připojování k databázi pomocí LINQ to SQL

  • Funkce jazyka Visual Basic, které podporují LINQ

  • Odložené a okamžité spuštění dotazu

  • XML v jazyce Visual Basic

  • Související zdroje

  • Témata s postupy a návody

Spuštění příkladů

Pro spuštění příkladů v úvodu a v oddílu „Struktura dotazu LINQ“, začleňte následující kód, který vrátí seznam zákazníků a objednávek.

' Return a list of customers. 
Private Function GetCustomers() As List(Of Customer)
    Return New List(Of Customer) From
        {
            New Customer With {.CustomerID = 1, .CompanyName = "Contoso, Ltd", .City = "Halifax", .Country = "Canada"},
            New Customer With {.CustomerID = 2, .CompanyName = "Margie's Travel", .City = "Redmond", .Country = "United States"},
            New Customer With {.CustomerID = 3, .CompanyName = "Fabrikam, Inc.", .City = "Vancouver", .Country = "Canada"}
        }
End Function 

' Return a list of orders. 
Private Function GetOrders() As List(Of Order)
    Return New List(Of Order) From
        {
            New Order With {.CustomerID = 1, .Amount = "200.00"},
            New Order With {.CustomerID = 3, .Amount = "600.00"},
            New Order With {.CustomerID = 1, .Amount = "300.00"},
            New Order With {.CustomerID = 2, .Amount = "100.00"},
            New Order With {.CustomerID = 3, .Amount = "800.00"}
        }
End Function 

' Customer Class. 
Private Class Customer
    Public Property CustomerID As Integer 
    Public Property CompanyName As String 
    Public Property City As String 
    Public Property Country As String 
End Class 

' Order Class. 
Private Class Order
    Public Property CustomerID As Integer 
    Public Property Amount As Decimal 
End Class

Poskytovatelé LINQ

Poskytovatel LINQ mapuje vaše dotazy Visual Basic LINQ na dotazovaný zdroj dat.Při psaní dotazu LINQ poskytovatel přebírá tento dotaz a přeloží ho do příkazů, které zdroj dat bude moci spustit.Poskytovatel také převádí data ze zdroje na objekty, které tvoří výsledek dotazu.Nakonec převede objekty na data při odeslání aktualizací do zdroje dat.

Visual Basic obsahuje následující poskytovatele LINQ.

Poskytovatel

Description

LINQ to Objects

Poskytovatel LINQ to Objects umožňuje dotazování kolekcí a polí v paměti.Pokud objekt podporuje rozhraní buď IEnumerable, nebo IEnumerable rozhraní, poskytovatel LINQ to Objects to umožňuje zjistit.

Můžete povolit zprostředkovatele LINQ to Objects pomocí importu oboru názvů System.Linq, který je ve výchozím nastavení importován pro všechny projekty Visual Basic.

Další informace o poskytovateli LINQ to Objects naleznete v LINQ na objekty.

LINQ to SQL

Poskytovatel LINQ to SQL umožňuje dotazování a modifikaci dat v databázi serveru SQL Server.To usnadňuje mapování modelu objektu pro aplikaci tabulek a objektů v databázi.

Visual Basic je snazší pracovat s technologií LINQ to SQL, včetně návrháře relací objektů (O/R Designer).Tento návrhář slouží k vytvoření modelu objektu v aplikaci, která mapuje pro objekty v databázi.O/R Designer také přiřazuje funkce mapě uložených procedur a funkcí objektu DataContext, který skladuje komunikaci s databází a ukládá stav kontroly optimistické souběžnosti.

Další informace o poskytovateli LINQ to SQL naleznete v tématu LINQ to SQL [LINQ to SQL].Další informace o Návrháři relací objektů naleznete v tématu Object Relational Designer (O/R Designer).

LINQ to XML

Poskytovatel LINQ to XML slouží k dotazování a modifikaci XML.Můžete změnit paměť XML nebo načíst z XML a uložit XML do souboru.

Poskytovatel LINQ to XML navíc umožňuje literály XML a vlastnosti os XML, které umožňují zapisovat XML přímo do vašeho kódu Visual Basic.Další informace naleznete v tématu XML v jazyce Visual Basic.

Technologie LINQ to DataSet

Poskytovatel LINQ to DataSet umožňuje dotazování a aktualizaci dat v sadě dat ADO.NET.Můžete přidat sílu LINQ pro aplikace používající datové sedy, abyste zjednodušili a rozšířili schopnosti pro dotazování, agregaci a aktualizaci dat v datové sadě.

Další informace naleznete v tématu LINQ to DataSet.

Struktura dotazu LINQ

Dotaz LINQ, označovaný také jako výraz dotazu, se skládá z kombinace klauzulí dotazu, které identifikují zdroje dat a iterační proměnné pro dotaz.Výraz dotazu může také obsahovat pokyny pro řazení, filtrování, seskupování a spojování nebo výpočty pro použití zdrojových dat.Syntaxe výrazu dotazu se podobá syntaxi SQL, takže vám může připadat velká část syntaxe známá.

Výraz dotazu začíná klauzulí From.Tato klauzule určuje zdroje dat pro dotaz a proměnné, které se používají k odkazování na každý prvek zdroje dat samostatně.Tyto proměnné jsou pojmenovány proměnné rozsahu nebo proměnné iterace.Klauzule From je zapotřebí v případě dotazu, s výjimkou dotazů Aggregate, kde je klauzule From volitelná.Po identifikaci oboru a zdroje dotazu v klauzuli From nebo Aggregate můžete zahrnout libovolnou kombinaci klauzulí dotazů k úpravě dotazu.Podrobné informace o klauzulích dotazu naleznete v části Visual Basic Operátory dotazu LINQ dále v tomto tématu.Například následující dotaz určuje zdrojovou kolekci zákaznických dat jako proměnnou customers a iterační proměnnou s názvem cust.

Dim customers = GetCustomers()

Dim queryResults = From cust In customers

For Each result In queryResults
    Debug.WriteLine(result.CompanyName & "  " & result.Country)
Next 

' Output: 
'   Contoso, Ltd  Canada 
'   Margie's Travel  United States 
'   Fabrikam, Inc.  Canada

Tento příklad je platný dotaz sám o sobě; dotaz je však mnohem výkonnější při přidání další klauzule dotazu, chcete-li upřesnit výsledky.Můžete například přidat klauzuli Where a filtrovat výsledky podle jedné nebo více hodnot.Výrazy dotazu představují jeden řádek kódu. Další klauzule dotazu můžete přidat pouze na konec dotazu.Dotaz můžete rozdělit přes více řádků textu, aby se zlepšila čitelnost pomocí znaku podtržítka (_) pro pokračování řádku.Následující příklad kódu ukazuje příklad dotazu, který zahrnuje klauzuli Where.

Dim queryResults = From cust In customers
                   Where cust.Country = "Canada"

Další výkonnou klauzulí dotazu je klauzule Select, která umožňuje vrátit pouze vybraná pole z datového zdroje.Dotazy LINQ vrací vyčíslitelné kolekce výrazných objektů.Dotaz může vrátit kolekci anonymních typů nebo pojmenovaných typů.Můžete také použít klauzuli Select pro vrácení jednoho pole ze zdroje dat.Když toto provedete, typ vrácené kolekce je typ tohoto jednoho pole.Můžete také použít klauzuli Select pro vrácení více polí ze zdroje dat.Když toto provedete, typ vrácené kolekce je nový anonymní typ.Můžete také porovnat pole vrácená dotazem s poli zadaného názvu typu.Následující příklad kódu ukazuje výraz dotazu, který vrátí kolekci anonymních typů, jejichž členové obsahují data z vybraných polí ze zdroje dat.

Dim queryResults = From cust In customers
               Where cust.Country = "Canada" 
               Select cust.CompanyName, cust.Country

Dotazy LINQ lze také použít ke kombinaci více zdrojů dat a vrácení jednoho výsledku.To lze provést s jednou nebo více klauzulemi From nebo pomocí klauzulí dotazů Join nebo Group Join.Následující příklad kódu ukazuje výraz dotazu, který kombinuje data odběratele a objednávky a vrátí kolekci anonymních typů s daty odběratele a objednávky.

Dim customers = GetCustomers()
Dim orders = GetOrders()

Dim queryResults = From cust In customers, ord In orders
           Where cust.CustomerID = ord.CustomerID
           Select cust, ord

For Each result In queryResults
    Debug.WriteLine(result.ord.Amount & "  " & result.ord.CustomerID & "  " & result.cust.CompanyName)
Next 

' Output: 
'   200.00  1  Contoso, Ltd 
'   300.00  1  Contoso, Ltd 
'   100.00  2  Margie's Travel 
'   600.00  3  Fabrikam, Inc. 
'   800.00  3  Fabrikam, Inc.

Můžete použít klauzuli Group Join pro vytvoření hierarchického dotazu výsledku, který obsahuje kolekci objektů zákazníka.Každý objekt zákazníka má vlastnost, která obsahuje kolekci všech objednávek tohoto zákazníka.Následující příklad kódu ukazuje výraz dotazu, který v rámci hierarchické odpovědi kombinuje data odběratele a objednávky a vrátí kolekci anonymních typů.Dotaz vrátí typ obsahující vlastnost CustomerOrders, která obsahuje kolekci dat objednávky zákazníka.Zahrnuje také vlastnost OrderTotal, která obsahuje součet součtů pro všechny objednávky daného zákazníka. (Tento dotaz je ekvivalentní k LEFT OUTER JOIN).

Dim customers = GetCustomers()
Dim orders = GetOrders()

Dim queryResults = From cust In customers
                   Group Join ord In orders On
                     cust.CustomerID Equals ord.CustomerID
                     Into CustomerOrders = Group,
                          OrderTotal = Sum(ord.Amount)
                   Select cust.CompanyName, cust.CustomerID,
                          CustomerOrders, OrderTotal

For Each result In queryResults
    Debug.WriteLine(result.OrderTotal & "  " & result.CustomerID & "  " & result.CompanyName)
    For Each ordResult In result.CustomerOrders
        Debug.WriteLine("   " & ordResult.Amount)
    Next 
Next 

' Output: 
'   500.00  1  Contoso, Ltd 
'      200.00 
'      300.00 
'   100.00  2  Margie's Travel 
'      100.00 
'   1400.00  3  Fabrikam, Inc. 
'      600.00 
'      800.00

Existuje několik dalších operátorů dotazu LINQ, které mohou vytvářet výkonné výrazy dotazů.V další části tohoto tématu jsou popsány různé klauzule dotazu, které můžete zahrnout do výrazu dotazu.Další informace o Visual Basic klauzulích dotazů naleznete v tématu Dotazy (Visual Basic).

Operátory dotazů LINQ jazyka Visual Basic

Třídy v oboru názvů System.Linq a jiných oborech názvů, které podporují dotazy LINQ, zahrnují metody, které můžete volat a vytvářet a upřesnit tak dotazy v závislosti na potřebách aplikace.Token Visual Basic obsahuje klíčová slova pro nejběžnější klauzule dotazu, jak je popsáno v následující tabulce.

Termín

Definice

From – klauzule (Visual Basic)

Buď klauzule From nebo klauzule Aggregate je vyžadována na začátku dotazu.Klauzule From určuje zdrojovou kolekci a proměnnou iterace pro dotaz.Příklad:

Select – klauzule (Visual Basic)

Volitelné.Deklaruje sadu iteračních proměnných pro dotaz.Příklad:

Pokud není zadána klauzule Select, iterační proměnné pro dotaz jsou tvořeny iteračními proměnnými určenými klauzulí From nebo Aggregate.

Where – klauzule (Visual Basic)

Volitelné.Určuje podmínku filtrování dotazu.Příklad:

Order By – klauzule (Visual Basic)

Volitelné.Určuje pořadí řazení pro sloupce v dotazu.Příklad:

Join – klauzule (Visual Basic)

Volitelné.Kombinuje dvě kolekce do jedné kolekce.Příklad:

Group By – klauzule (Visual Basic)

Volitelné.Seskupuje prvky sady výsledků.Lze použít k aplikaci agregačních funkcí na každou skupinu.Příklad:

Group Join – klauzule (Visual Basic)

Volitelné.Kombinuje dvě kolekce do jedné hierarchické kolekce.Příklad:

Aggregate – klauzule (Visual Basic)

Buď klauzule From nebo klauzule Aggregate je vyžadována na začátku dotazu.Klauzule Aggregate aplikuje jednu nebo více agregačních funkcí na kolekci.Můžete například použít Aggregate klauzule a vypočítat součet všech prvků vrácených dotazem.

Můžete také použít klauzule Aggregate pro úpravu dotazu.Můžete například použít Aggregate k provedení výpočtu v kolekci souvisejících dotazů.

Let – klauzule (Visual Basic)

Volitelné.Vypočítá hodnotu a přiřadí ji nové proměnné v dotazu.Příklad:

Distinct – klauzule (Visual Basic)

Volitelné.Omezí hodnoty aktuální iterační proměnné a odstraní tak duplicitní hodnoty ve výsledcích dotazu.Příklad:

Skip – klauzule (Visual Basic)

Volitelné.Vynechá zadaný počet prvků v kolekci a vrátí zbývající prvky.Příklad:

Skip While – klauzule (Visual Basic)

Volitelné.Vynechává prvky v kolekci, dokud je zadaná podmínka true a vrací zbývající prvky.Příklad:

Take – klauzule (Visual Basic)

Volitelné.Vrátí zadaný počet souvislých prvků od začátku kolekce.Příklad:

Take While – klauzule (Visual Basic)

Volitelné.Obsahuje prvky v kolekci, pokud je zadaná podmínka true a jsou vynechány zbývající prvky.Příklad:

Další informace o Visual Basic klauzulích dotazů naleznete v tématu Dotazy (Visual Basic).

Můžete použít další funkce dotazu LINQ voláním členů vyčíslitelného a dotazovatelného typu, které poskytuje LINQ.Tyto další funkce můžete použít voláním operátora pro konkrétní dotaz na výsledek výrazu dotazu.Například následující příklad kódu používá metodu Union``1 ke kombinaci výsledků dvou dotazů do výsledku jednoho dotazu.Používá metodu ToList``1 pro vrácení výsledků dotazu v podobě obecného seznamu.

Public Function GetAllCustomers() As List(Of Customer)
    Dim customers1 = From cust In domesticCustomers
    Dim customers2 = From cust In internationalCustomers

    Dim customerList = customers1.Union(customers2)

    Return customerList.ToList()
End Function

Podrobnosti o dalších možnostech LINQ naleznete v tématu Přehled standardních operátorů dotazu.

Připojování k databázi pomocí LINQ to SQL

V rámci Visual Basic identifikujete databázové objekty pro SQL Server, jako například tabulky, zobrazení a uložené procedury, ke kterým chcete získat přístup pomocí souboru LINQ to SQL.Soubor LINQ to SQL má příponou DBML.

Pokud máte platné připojení k databázi serveru SQL Server, můžete přidat položku šablony Třídy LINQ to SQL do svého projektu.Zobrazí se Návrhář relací objektů (návrhář O/R).O/R Designer umožňuje přetažení položek, kterým chcete udělit přístup v kódu z Průzkumníka serveru/Průzkumníka databáze na návrhové ploše.Soubor LINQ to SQL přidá objekt DataContext do vašeho projektu.Tento objekt obsahuje vlastnosti a kolekce pro tabulky a zobrazení, které mají přístup a metody pro uložené procedury, které chcete volat.Po uložení změn souboru LINQ to SQL (DBML) máte přístup k těmto objektům ve vašem kódu odkázáním na objekt DataContext, který je definován pomocí návrháře O/R.Objekt DataContext pro projekt je založen na názvu souboru LINQ to SQL.Příklad soubor z LINQ na SQL s názvem Northwind.dbml vytvoří objekt DataContext s názvem NorthwindDataContext.

Příklady s podrobnými pokyny naleznete v tématu Postupy: Dotaz databáze pomocí LINQ (Visual Basic) a Postupy: Volání uložené procedury pomocí LINQ (Visual Basic).

Funkce jazyka Visual Basic, které podporují LINQ

Visual Basic obsahuje další důležité funkcí, které provedou jednoduché použití LINQ a sníží objem kódu, který musíte napsat k provádění dotazů LINQ.Patří sem následující:

  • Anonymní typy, které umožňují vytvoření nového typu na základě výsledku dotazu.

  • Implicitně zadané proměnné, které umožňují odložit určení typu a umožňují kompilátoru odvození typu na základě výsledku dotazu.

  • Rozšiřující metody, které umožňují rozšířit existující typ vašimi vlastními metodami a neměnit samotný datový typ.

Další informace naleznete v tématu Funkce Visual Basic podporující LINQ.

Odložené a okamžité spuštění dotazu

Provedení dotazu se liší od vytvoření dotazu.Po vytvoření dotazu je jeho spuštění vyvoláno samostatným mechanismem.Dotaz může být proveden, jakmile je definován (okamžité provedení), nebo může být definice uložena a dotaz může být proveden později (odložené provedení).

Podle výchozího nastavení se při vytváření dotazu samotný dotaz nespustí ihned.Namísto toho je definice dotazu uložena v proměnné, která je použita pro odkaz na výsledek dotazu.Pokud přistoupíte k výsledku proměnné později v kódu, například u smyčky For…Next spustí se dotaz.Tento proces se nazývá odložené provedení.

Dotazy mohou být provedeny také, když jsou definovány. To je označováno jako okamžité provedení.Můžete zahájit okamžité spuštění uplatněním metody, která vyžaduje přístup k jednotlivým elementům výsledku dotazu.To může být výsledek vložení agregační funkce, jako například Count, Sum, Average, Min nebo Max.Další informace o agregačních funkcích naleznete v tématu Aggregate – klauzule (Visual Basic).

Použitím metod ToList nebo ToArray bude také vynuceno okamžité spuštění.To může být užitečné, pokud chcete okamžitě spustit dotaz a uložit výsledky do mezipaměti.Další informace o těchto metodách naleznete v tématu Převádění datových typů.

Další informace o zpracování dotazů naleznete v tématu Napište svůj první dotaz LINQ (Visual Basic).

XML v jazyce Visual Basic

Funkce XML v Visual Basic zahrnuje literály XML a vlastnosti osy XML, které umožňují snadno vytvořit, přístup, dotazování a modifikaci XML ve vašem kódu.Literály XML umožňují zapisovat XML přímo do vašeho kódu.Kompilátor jazyka Visual Basic používá XML jako datový objekt první třídy.

Následující příklad kódu ukazuje, jak vytvořit prvek XML, jak získat přístup k jeho dílčím prvkům a atributům a odeslat dotaz na obsah prvku s využitím jazyka LINQ.

' Place Imports statements at the top of your program.   
Imports <xmlns:ns="http://SomeNamespace">

Module Sample1

    Sub SampleTransform()

        ' Create test by using a global XML namespace prefix.  

        Dim contact = 
            <ns:contact>
                <ns:name>Patrick Hines</ns:name>
                <ns:phone ns:type="home">206-555-0144</ns:phone>
                <ns:phone ns:type="work">425-555-0145</ns:phone>
            </ns:contact>

        Dim phoneTypes = 
          <phoneTypes>
              <%= From phone In contact.<ns:phone> 
                  Select <type><%= phone.@ns:type %></type> 
              %>
          </phoneTypes>

        Console.WriteLine(phoneTypes)
    End Sub 

End Module

Další informace naleznete v tématu XML v jazyce Visual Basic.

Související zdroje

Téma

Description

XML v jazyce Visual Basic

Popisuje funkce XML v Visual Basic, které mohou být dotazovány a které umožňují zahrnout XML jako datové objekty první třídy v kódu Visual Basic.

Dotazy (Visual Basic)

Poskytuje referenční informace o klauzulích dotazu dostupných v rámci Visual Basic.

LINQ (Language-Integrated Query)

Obsahuje obecné informace, pokyny pro programování a ukázky pro funkci LINQ.

LINQ to SQL [LINQ to SQL]

Obsahuje obecné informace, pokyny pro programování a ukázky pro funkci LINQ to SQL.

LINQ na objekty

Obsahuje obecné informace, pokyny pro programování a ukázky pro funkci LINQ to Objects.

LINQ to ADO.NET (stránka portálu)

Obsahuje odkazy na obecné informace, pokyny pro programování a ukázky pro funkci LINQ to ADO.NET.

LINQ to XML

Obsahuje obecné informace, pokyny pro programování a ukázky pro funkci LINQ to XML.

Témata s postupy a návody

Postupy: Dotaz databáze pomocí LINQ (Visual Basic)

Postupy: Volání uložené procedury pomocí LINQ (Visual Basic)

Postupy: Změna dat v databázi pomocí LINQ (Visual Basic)

Postupy: Kombinace dat s LINQ pomocí spojení (Visual Basic)

Postupy: Řazení výsledků dotazu pomocí LINQ (Visual Basic)

Postupy: Filtrování výsledků dotazu pomocí LINQ (Visual Basic)

Postupy: Počet, suma nebo průměr dat pomocí LINQ (Visual Basic)

Postupy: Hledání minimální nebo maximální hodnoty ve výsledku dotazu pomocí LINQ (Visual Basic)

Walkthrough: Creating LINQ to SQL Classes (O/R Designer)

How to: Assign Stored Procedures to Perform Updates, Inserts, and Deletes (O/R Designer)

Doporučené kapitoly knihy

Chapter 17: LINQ v Programming Visual Basic 2008

Viz také

Úkoly

Ukázky LINQ

Koncepty

Přehled technologie LINQ to XML v jazyce Visual Basic

LINQ to DataSet Overview

DataContext Methods (O/R Designer)

Další zdroje

LINQ (Language-Integrated Query)

LINQ to SQL [LINQ to SQL]

Object Relational Designer (O/R Designer)