Знакомство с LINQ в Visual BasicIntroduction to LINQ in Visual Basic

Языковой интегрированный запрос (LINQ) добавляет возможности запросов в Visual Basic и предоставляет простые и эффективные возможности при работе со всеми типами данных.Language-Integrated Query (LINQ) adds query capabilities to Visual Basic and provides simple and powerful capabilities when you work with all kinds of data. Вместо отправки запроса в базу данных для обработки или работы с другим синтаксисом запросов для каждого типа искомых данных LINQ вводит запросы в составе языка Visual Basic.Rather than sending a query to a database to be processed, or working with different query syntax for each type of data that you are searching, LINQ introduces queries as part of the Visual Basic language. Синтаксис запросов не зависит от типа данных.It uses a unified syntax regardless of the type of data.

LINQ позволяет запрашивать данные из SQL Server базы данных, XML, массивов в памяти и коллекций, ADO.NET DataSets или любого другого удаленного или локального источника данных, поддерживающего LINQ.LINQ enables you to query data from a SQL Server database, XML, in-memory arrays and collections, ADO.NET datasets, or any other remote or local data source that supports LINQ. Все это можно сделать с помощью стандартных элементов языка Visual Basic.You can do all this with common Visual Basic language elements. Так как запросы написаны на языке Visual Basic, результаты запроса возвращаются в виде строго типизированных объектов.Because your queries are written in the Visual Basic language, your query results are returned as strongly-typed objects. Эти объекты поддерживают технологию IntelliSense, что позволяет писать код быстрее и перехватывать ошибки в запросах при компиляции, а не при выполнении.These objects support IntelliSense, which enables you to write code faster and catch errors in your queries at compile time instead of at run time. Запросы LINQ можно использовать как источник дополнительных запросов для уточнения результатов,LINQ queries can be used as the source of additional queries to refine results. а также связывать с элементами управления, позволяя пользователям легко просматривать и изменять результаты запросов.They can also be bound to controls so that users can easily view and modify your query results.

Например в следующем примере кода показан запрос LINQ, возвращающий список заказчиков из коллекции и группирующий их по расположению.For example, the following code example shows a LINQ query that returns a list of customers from a collection and groups them based on their location.

' 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

Выполнение примеровRunning the examples

Чтобы выполнить примеры во введении и в структуре раздела запроса LINQ , включите следующий код, который возвращает списки клиентов и заказов.To run the examples in the introduction and in the Structure of a LINQ Query section, include the following code, which returns lists of customers and orders.

' 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

Поставщики LINQLINQ providers

Поставщик LINQ сопоставляет Visual Basic запросы LINQ с запрашиваемым источником данных.A LINQ provider maps your Visual Basic LINQ queries to the data source being queried. При написании запроса LINQ поставщик принимает запрос и переводит его в команды, которые источник данных будет способен выполнить.When you write a LINQ query, the provider takes that query and translates it into commands that the data source will be able to execute. Затем поставщик преобразует данные из источника в объекты, составляющие результат запроса.The provider also converts data from the source to the objects that make up your query result. И, наконец, при отправке обновлений на источник данных он преобразует объекты в данные.Finally, it converts objects to data when you send updates to the data source.

Visual Basic включает следующие поставщики LINQ.Visual Basic includes the following LINQ providers.

ПоставщикProvider ОписаниеDescription
LINQ to ObjectsLINQ to Objects Поставщик LINQ to Objects позволяет направлять запросы к коллекциям и массивам, которые находятся в памяти.The LINQ to Objects provider enables you to query in-memory collections and arrays. Если объект поддерживает интерфейс IEnumerable или IEnumerable<T>, поставщик LINQ to Objects позволяет направлять к нему запросы.If an object supports either the IEnumerable or IEnumerable<T> interface, the LINQ to Objects provider enables you to query it.

Поставщик LINQ to Objects можно включить, импортировав System.Linq пространство имен, которое по умолчанию импортируется для всех проектов Visual Basic.You can enable the LINQ to Objects provider by importing the System.Linq namespace, which is imported by default for all Visual Basic projects.

Дополнительные сведения о поставщике LINQ to Objects см. в разделе LINQ to Objects.For more information about the LINQ to Objects provider, see LINQ to Objects.
LINQ to SQLLINQ to SQL Поставщик LINQ to SQL позволяет запрашивать и изменять данные в базе данных SQL Server.The LINQ to SQL provider enables you to query and modify data in a SQL Server database. Это упрощает сопоставление объектной модели приложения с таблицами и объектами в базе данных.This makes it easy to map the object model for an application to the tables and objects in a database.

Visual Basic упрощает работу с LINQ to SQL, включая реляционный конструктор объектов (реляционный конструктор R).Visual Basic makes it easier to work with LINQ to SQL by including the Object Relational Designer (O/R Designer). Он используется для создания в приложении модели объекта, которая сопоставляется с объектами в базе данных.This designer is used to create an object model in an application that maps to objects in a database. Реляционный конструктор DataContext объектов также предоставляет функции для соотнесения хранимых процедур и функций к объекту, который управляет связью с базой данных и сохраняет состояние для проверок оптимистического параллелизма.The O/R Designer also provides functionality to map stored procedures and functions to the DataContext object, which manages communication with the database and stores state for optimistic concurrency checks.

Дополнительные сведения о поставщике LINQ to SQL см. в разделе LINQ to SQL.For more information about the LINQ to SQL provider, see LINQ to SQL. Дополнительные сведения о реляционный конструктор объектов см. в разделе средства LINQ to SQL в Visual Studio.For more information about the Object Relational Designer, see LINQ to SQL Tools in Visual Studio.
LINQ to XMLLINQ to XML Поставщик LINQ to XML позволяет запрашивать и изменять XML.The LINQ to XML provider enables you to query and modify XML. XML можно изменить в памяти, загрузить из файла и сохранить в файл.You can modify in-memory XML, or you can load XML from and save XML to a file.

Кроме того, поставщик LINQ to XML включает XML-литералы и свойства осей XML, позволяющие писать XML-код непосредственно в коде Visual Basic.Additionally, the LINQ to XML provider enables XML literals and XML axis properties that enable you to write XML directly in your Visual Basic code. Дополнительные сведения см. в разделе XML.For more information, see XML.
LINQ to DataSetLINQ to DataSet Поставщик LINQ to DataSet позволяет запрашивать и обновлять данные в наборе данных ADO.NET.The LINQ to DataSet provider enables you to query and update data in an ADO.NET dataset. Функции LINQ можно добавить в приложения, использующие наборы данных — это позволит упростить и расширить возможности составления запросов, статистической обработки и обновления данных в наборе данных.You can add the power of LINQ to applications that use datasets in order to simplify and extend your capabilities for querying, aggregating, and updating the data in your dataset.

Дополнительные сведения см. в разделе LINQ to DataSet.For more information, see LINQ to DataSet.

Структура запроса LINQStructure of a LINQ query

Запрос LINQ, часто называемый выражением запроса, состоит из сочетания предложений запроса, которые указывают источники данных и переменные итерации для запроса.A LINQ query, often referred to as a query expression, consists of a combination of query clauses that identify the data sources and iteration variables for the query. Выражение запроса может также включать инструкции для сортировки, фильтрации, группировки и присоединения либо формулы для применения к исходным данным.A query expression can also include instructions for sorting, filtering, grouping, and joining, or calculations to apply to the source data. Синтаксис выражения запроса напоминает синтаксис SQL, поэтому многие его элементы могут показаться вам знакомыми.Query expression syntax resembles the syntax of SQL; therefore, you may find much of the syntax familiar.

Выражение запроса начинается с предложения From.A query expression starts with a From clause. Это предложение определяет исходные данные для запроса и переменные, которые используются для обращения к каждому элементу источника данных по отдельности.This clause identifies the source data for a query and the variables that are used to refer to each element of the source data individually. Эти переменные являются именованными переменными диапазона или переменными итераций.These variables are named range variables or iteration variables. Предложение From является обязательным для запросов, кроме запросов Aggregate, где предложение From использовать необязательно.The From clause is required for a query, except for Aggregate queries, where the From clause is optional. После определения области и источника запроса в предложении From или Aggregate можно добавить любую комбинацию предложений для уточнения запроса.After the scope and source of the query are identified in the From or Aggregate clauses, you can include any combination of query clauses to refine the query. Дополнительные сведения о предложениях запросов см. в разделе Visual Basic операторы запросов LINQ далее в этой статье.For details about query clauses, see Visual Basic LINQ Query Operators later in this topic. Например, следующий запрос определяет исходную коллекцию данных клиента как переменную customers и как итерационную переменную cust.For example, the following query identifies a source collection of customer data as the customers variable, and an iteration variable named 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

Данный пример составляет допустимый запрос сам по себе, однако особенно эффективным запрос становится при добавлении нескольких предложений, уточняющих его результат.This example is a valid query by itself; however, the query becomes far more powerful when you add more query clauses to refine the result. Например, предложение Where позволяет отфильтровать результат по одному или нескольким значениям.For example, you can add a Where clause to filter the result by one or more values. Каждое выражение запроса — это одна строка кода, так что предложения можно просто добавлять в конец запроса.Query expressions are a single line of code; you can just append additional query clauses to the end of the query. Можно разбить запрос на несколько строк текста, чтобы улучшить удобочитаемость с помощью символа продолжения строки подчеркивания (_).You can break up a query across multiple lines of text to improve readability by using the underscore (_) line-continuation character. В приведенном ниже примере кода показан пример запроса с предложением Where.The following code example shows an example of a query that includes a Where clause.

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

Другое эффективное предложение запроса — это предложение Select, которое позволяет возвращать из источника данных только избранные поля.Another powerful query clause is the Select clause, which enables you to return only selected fields from the data source. Запросы LINQ возвращают перечислимые коллекции строго типизированных объектов.LINQ queries return enumerable collections of strongly typed objects. Запрос может вернуть коллекцию как анонимных, так и именованных типов.A query can return a collection of anonymous types or named types. Предложение Select позволяет вернуть из источника данных отдельное поле.You can use the Select clause to return only a single field from the data source. В этом случае типом возвращаемой коллекции является тип этого поля.When you do this, the type of the collection returned is the type of that single field. Кроме того, предложение Select позволяет вернуть из источника данных несколько полей.You can also use the Select clause to return multiple fields from the data source. В этом случае типом возвращаемой коллекции становится новый анонимный тип.When you do this, the type of the collection returned is a new anonymous type. Возвращенные запросом поля можно сопоставить с полями указанного именованного типа.You can also match the fields returned by the query to the fields of a specified named type. В приведенном ниже примере кода показано выражение запроса, возвращающее коллекцию анонимных типов, члены которой заполняются данными из выбранных полей источника данных.The following code example shows a query expression that returns a collection of anonymous types that have members populated with data from the selected fields from the data source.

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

Запросы LINQ могут также использоваться для объединения нескольких источников данных и получения единого результата.LINQ queries can also be used to combine multiple sources of data and return a single result. Это можно сделать с помощью одного или нескольких предложений From или с помощью предложений Join или Group Join.This can be done with one or more From clauses, or by using the Join or Group Join query clauses. В приведенном ниже примере кода показано выражение запроса, объединяющее данные клиентов и заказов и возвращающее коллекцию анонимных типов, содержащих объединенные данные.The following code example shows a query expression that combines customer and order data and returns a collection of anonymous types containing customer and order data.

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.

Для получения иерархического результата, содержащего коллекцию объектов клиента, в запросе можно использовать предложение Group Join.You can use the Group Join clause to create a hierarchical query result that contains a collection of customer objects. Каждый объект клиента имеет свойство, содержащее коллекцию всех заказов этого клиента.Each customer object has a property that contains a collection of all orders for that customer. В приведенном ниже примере кода показано выражение запроса, объединяющее данные клиентов и заказов в иерархический результат и возвращающее коллекцию анонимных типов.The following code example shows a query expression that combines customer and order data as a hierarchical result and returns a collection of anonymous types. Запрос возвращает тип, у которого есть свойство CustomerOrders, содержащее коллекцию данных заказов клиента.The query returns a type that includes a CustomerOrders property that contains a collection of order data for the customer. У него также есть свойство OrderTotal, которое содержит общую сумму всех заказов этого клиента.It also includes an OrderTotal property that contains the sum of the totals for all the orders for that customer. (Этот запрос эквивалентен LEFT OUTER JOIN).(This query is equivalent to a 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

Имеется несколько дополнительных операторов запросов LINQ, которые можно использовать для создания эффективных выражений запросов.There are several additional LINQ query operators that you can use to create powerful query expressions. В следующем разделе описываются различные предложения запросов, которые можно использовать в выражениях запросов.The next section of this topic discusses the various query clauses that you can include in a query expression. Дополнительные сведения о Visual Basic предложениях запросов см. в разделе запросы.For details about Visual Basic query clauses, see Queries.

Visual Basic операторы запросов LINQVisual Basic LINQ query operators

Классы в пространствах имен System.Linq и других пространствах имен, поддерживающих запросы LINQ (в частности, System.Linq), содержат методы создания и уточнения запросов с учетом нужд приложения.The classes in the System.Linq namespace and the other namespaces that support LINQ queries include methods that you can call to create and refine queries based on the needs of your application. Visual Basic содержит ключевые слова для следующих общих предложений запросов.Visual Basic includes keywords for the following common query clauses. Дополнительные сведения о Visual Basic предложениях запросов см. в разделе запросы.For details about Visual Basic query clauses, see Queries.

Предложение FromFrom clause

Для начала запроса требуется либо Aggregate предложение,либопредложение.From Either a From clause or an Aggregate clause is required to begin a query. Предложение From определяет коллекцию источника и переменную итерации для запроса.A From clause specifies a source collection and an iteration variable for a query. Например:For example:

' Returns the company name for all customers for which
' the Country is equal to "Canada".
Dim names = From cust In customers
            Where cust.Country = "Canada"
            Select cust.CompanyName

Select - предложениеSelect clause

Необязательный параметр.Optional. Предложение объявляет набор переменных итераций для запроса. Select A Select clause declares a set of iteration variables for a query. Например:For example:

' Returns the company name and ID value for each
' customer as a collection of a new anonymous type.
Dim customerList = From cust In customers
                   Select cust.CompanyName, cust.CustomerID

Если предложение Select не указано, то переменные итераций для запроса состоят из переменных итераций, указанных предложением From или Aggregate.If a Select clause is not specified, the iteration variables for the query consist of the iteration variables specified by the From or Aggregate clause.

Предложение WhereWhere clause

Необязательный параметр.Optional. Предложение задает условие фильтрации для запроса. Where A Where clause specifies a filtering condition for a query. Например:For example:

' Returns all product names for which the Category of
' the product is "Beverages".
Dim names = From product In products
            Where product.Category = "Beverages"
            Select product.Name

ORDER BY, предложение]Order By clause]

| Используемых.|Optional. Предложение задает порядок сортировки для столбцов в запросе. Order By An Order By clause specifies the sort order for columns in a query. Например:For example:

' Returns a list of books sorted by price in 
' ascending order.
Dim titlesAscendingPrice = From b In books
                           Order By b.price

Join - предложениеJoin clause

Необязательный параметр.Optional. Предложение объединяет две коллекции в одну. Join A Join clause combines two collections into a single collection. Например:For example:

' Returns a combined collection of all of the 
' processes currently running and a descriptive
' name for the process taken from a list of 
' descriptive names.
Dim processes = From proc In Process.GetProcesses
                Join desc In processDescriptions
                  On proc.ProcessName Equals desc.ProcessName
                Select proc.ProcessName, proc.Id, desc.Description

Group By - предложениеGroup By clause

Необязательный параметр.Optional. Предложение группирует элементы результата запроса. Group By A Group By clause groups the elements of a query result. Его можно использовать для применения агрегатных функций к каждой группе.It can be used to apply aggregate functions to each group. Например:For example:

' Returns a list of orders grouped by the order date
' and sorted in ascending order by the order date.
Dim orderList = From order In orders
                Order By order.OrderDate
                Group By OrderDate = order.OrderDate
                Into OrdersByDate = Group

Group Join - предложениеGroup Join clause

Необязательный параметр.Optional. Предложение объединяет две коллекции в одну иерархическую коллекцию. Group Join A Group Join clause combines two collections into a single hierarchical collection. Например:For example:

' Returns a combined collection of customers and
' customer orders.
Dim customerList = From cust In customers
                   Group Join ord In orders On
                     cust.CustomerID Equals ord.CustomerID
                   Into CustomerOrders = Group,
                        TotalOfOrders = Sum(ord.Amount)
                   Select cust.CompanyName, cust.CustomerID,
                          CustomerOrders, TotalOfOrders

Aggregate - предложениеAggregate clause

Для начала запроса требуется либо From предложение,либопредложение.Aggregate Either an Aggregate clause or a From clause is required to begin a query. Предложение Aggregate применяет к коллекции одну или несколько агрегатных функций.An Aggregate clause applies one or more aggregate functions to a collection. Например, Aggregate предложение можно использовать для вычисления суммы всех элементов, возвращаемых запросом, как показано в следующем примере.For example, you can use the Aggregate clause to calculate a sum for all the elements returned by a query, as the following example does.

' Returns the sum of all order amounts.
Dim orderTotal = Aggregate order In orders
                 Into Sum(order.Amount)

Предложение Aggregate можно также использовать для изменения запроса.You can also use the Aggregate clause to modify a query. Например, с помощью предложения Aggregate можно произвести вычисление с соответствующей коллекцией запросов.For example, you can use the Aggregate clause to perform a calculation on a related query collection. Например:For example:

' Returns the customer company name and largest 
' order amount for each customer.
Dim customerMax = From cust In customers
                  Aggregate order In cust.Orders
                  Into MaxOrder = Max(order.Amount)
                  Select cust.CompanyName, MaxOrder

Let - предложениеLet clause

Необязательный параметр.Optional. Предложение выполняет вычисление значения и присваивает его новой переменной в запросе. Let A Let clause computes a value and assigns it to a new variable in the query. Например:For example:

' Returns a list of products with a calculation of
' a ten percent discount.
Dim discountedProducts = From prod In products
                         Let Discount = prod.UnitPrice * 0.1
                         Where Discount >= 50
                         Select prod.Name, prod.UnitPrice, Discount

Distinct - предложениеDistinct clause

Необязательный параметр.Optional. Distinct Предложение позволяет ограничивать значения текущей переменной итерации, чтобы исключить дублирующиеся значения в результатах запроса.A Distinct clause restricts the values of the current iteration variable to eliminate duplicate values in query results. Например:For example:

' Returns a list of cities with no duplicate entries.
Dim cities = From item In customers
             Select item.City
             Distinct

Skip - предложениеSkip clause

Необязательный параметр.Optional. Предложение обходит указанное число элементов в коллекции, а затем возвращает остальные элементы. Skip A Skip clause bypasses a specified number of elements in a collection and then returns the remaining elements. Например:For example:

' Returns a list of customers. The first 10 customers
' are ignored and the remaining customers are
' returned.
Dim customerList = From cust In customers
                   Skip 10

Skip While - предложениеSkip While clause

Необязательный параметр.Optional. Предложение обходит элементы в коллекции, пока заданное условие имеет значение true , а затем возвращает оставшиеся элементы. Skip While A Skip While clause bypasses elements in a collection as long as a specified condition is true and then returns the remaining elements. Например:For example:

' Returns a list of customers. The query ignores all
' customers until the first customer for whom
' IsSubscriber returns false. That customer and all
' remaining customers are returned.
Dim customerList = From cust In customers
                   Skip While IsSubscriber(cust)

Take - предложениеTake clause

Необязательный параметр.Optional. Предложение возвращает указанное число смежных элементов от начала коллекции. Take A Take clause returns a specified number of contiguous elements from the start of a collection. Например:For example:

' Returns the first 10 customers.
Dim customerList = From cust In customers
                   Take 10

Take While - предложениеTake While clause

Необязательный параметр.Optional. Предложение включает элементы в коллекцию, пока заданное условие является true и обходит оставшиеся элементы. Take While A Take While clause includes elements in a collection as long as a specified condition is true and bypasses the remaining elements. Например:For example:

' Returns a list of customers. The query returns
' customers until the first customer for whom 
' HasOrders returns false. That customer and all 
' remaining customers are ignored.
Dim customersWithOrders = From cust In customers
                          Order By cust.Orders.Count Descending
                          Take While HasOrders(cust)

Использование дополнительных функций запросов LINQUse additional LINQ query features

Обращаясь к членам перечислимых и доступных для запроса типов, предоставляемых технологией LINQ, можно использовать дополнительные возможности запросов LINQ.You can use additional LINQ query features by calling members of the enumerable and queryable types provided by LINQ. Для этого на результат выражения запроса необходимо вызвать определенный оператор запроса.You can use these additional capabilities by calling a particular query operator on the result of a query expression. Например, в следующем примере Enumerable.Union метод используется для объединения результатов двух запросов в один результат запроса.For example, the following example uses the Enumerable.Union method to combine the results of two queries into one query result. Для возвращения результата запроса в виде универсального списка используется метод Enumerable.ToList.It uses the Enumerable.ToList method to return the query result as a generic list.

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

Дополнительные сведения о дополнительных возможностях LINQ см. в статье Общие сведения о стандартных операторах запросов.For details about additional LINQ capabilities, see Standard Query Operators Overview.

Подключение к базе данных с помощью LINQ to SQLConnect to a database by using LINQ to SQL

В Visual Basic вы определяете объекты базы данных SQL Server, такие как таблицы, представления и хранимые процедуры, к которым необходимо получить доступ с помощью файла LINQ to SQL.In Visual Basic, you identify the SQL Server database objects, such as tables, views, and stored procedures, that you want to access by using a LINQ to SQL file. Файл LINQ to SQL имеет расширение DBML.A LINQ to SQL file has an extension of .dbml.

При наличии допустимого соединения с SQL Server базой данных можно добавить в проект шаблон элемента LINQ to SQL классов .When you have a valid connection to a SQL Server database, you can add a LINQ to SQL Classes item template to your project. Это позволит отобразить реляционный конструктор объектов (O/R-конструктор).This will display the Object Relational Designer (O/R designer). Реляционный конструктор объектов позволяет перетаскивать элементы, к которым требуется доступ в коде, из Обозреватель сервера/Обозреватель базы данных на поверхность конструктора.The O/R Designer enables you to drag the items that you want to access in your code from the Server Explorer/Database Explorer onto the designer surface. Файл LINQ to SQL добавляет в проект объект DataContext.The LINQ to SQL file adds a DataContext object to your project. Этот объект включает свойства и коллекции для таблиц и представлений, к которым нужно получить доступ, а также необходимые методы для хранимых процедур.This object includes properties and collections for the tables and views that you want access to, and methods for the stored procedures that you want to call. После сохранения изменений в файле LINQ to SQL (DBML) можно получить доступ к этим объектам в коде, обратившись к определенному O/R-конструктором объекту DataContext.After you have saved your changes to the LINQ to SQL (.dbml) file, you can access these objects in your code by referencing the DataContext object that is defined by the O/R Designer. Объекту DataContext для проекта присваивается имя, которое определяется именем файла LINQ to SQL.The DataContext object for your project is named based on the name of your LINQ to SQL file. Например, файл LINQ to SQL с именем Northwind.dbml создаст объект DataContext с именем NorthwindDataContext.For example, a LINQ to SQL file that is named Northwind.dbml will create a DataContext object named NorthwindDataContext.

Примеры с пошаговыми инструкциями см. в разделе как Запрос к базе данных и выполнение следующих действий. Вызов хранимой процедуры.For examples with step-by-step instructions, see How to: Query a Database and How to: Call a Stored Procedure.

Visual Basic функции, поддерживающие LINQVisual Basic features that support LINQ

Visual Basic включает другие важные функции, которые делают использование LINQ простым и сокращают объем кода, который необходимо написать для выполнения запросов LINQ.Visual Basic includes other notable features that make the use of LINQ simple and reduce the amount of code that you must write to perform LINQ queries. следующие основные параметры.These include the following:

  • Анонимные типы, которые позволяют создать новый тип на основе результата запроса.Anonymous types, which enable you to create a new type based on a query result.

  • Неявно типизированные переменные, которые позволяют отложить указание типа и позволить компилятору определить тип на основе результата запроса.Implicitly typed variables, which enable you to defer specifying a type and let the compiler infer the type based on the query result.

  • Методы расширения, позволяющие расширить существующий тип собственными методами, не изменяя сам тип.Extension methods, which enable you to extend an existing type with your own methods without modifying the type itself.

Дополнительные сведения см. в разделе Visual Basic функции, поддерживающие LINQ.For details, see Visual Basic Features That Support LINQ.

Отложенное и немедленное выполнение запросаDeferred and immediate query execution

Процессы выполнения и создания запросов разделены.Query execution is separate from creating a query. После создания запроса его выполнение инициируется отдельным механизмом.After a query is created, its execution is triggered by a separate mechanism. Запрос может быть выполнен, как только он определен (немедленноевыполнение), либо можно сохранить определение, и запрос можно будет выполнить позже (Отложенное выполнение).A query can be executed as soon as it is defined (immediate execution), or the definition can be stored and the query can be executed later (deferred execution).

По умолчанию вновь созданный запрос автоматически не выполняется.By default, when you create a query, the query itself does not execute immediately. Вместо этого определение запроса сохраняется в переменной, которая используется для ссылки на результат этого запроса.Instead, the query definition is stored in the variable that is used to reference the query result. Если впоследствии код обращается к переменной результата запроса, например в рамках цикла For…Next, запрос выполняется.When the query result variable is accessed later in code, such as in a For…Next loop, the query is executed. Этот процесс называется отложенным выполнением.This process is referred to as deferred execution.

Запросы также можно выполнять, когда они определены, что называется немедленной выполнением.Queries can also be executed when they are defined, which is referred to as immediate execution. Немедленное выполнение можно инициировать с помощью метода, который требует доступа к отдельным элементам результата запроса.You can trigger immediate execution by applying a method that requires access to individual elements of the query result. Это может быть результатом использования агрегатных функций, таких как Count, Sum, Average, Min или Max.This can be the result of including an aggregate function, such as Count, Sum, Average, Min, or Max. Дополнительные сведения о агрегатных функциях см. в разделе предложение Aggregate.For more information about aggregate functions, see Aggregate Clause.

Принудительно вызвать немедленное выполнение запросов позволяют также методы ToList и ToArray.Using the ToList or ToArray methods will also force immediate execution. Это пригодится в том случае, если требуется выполнить запрос немедленно и кэшировать результаты.This can be useful when you want to execute the query immediately and cache the results. Дополнительные сведения об этих методах см. в разделе Преобразование типов данных.For more information about these methods, see Converting Data Types.

Дополнительные сведения о выполнении запросов см. в разделе Написание первого запроса LINQ.For more information about query execution, see Writing Your First LINQ Query.

XML в Visual BasicXML in Visual Basic

Функции XML в Visual Basic включают XML-литералы и свойства осей XML, которые позволяют легко создавать, получать доступ к XML и изменять их в коде.The XML features in Visual Basic include XML literals and XML axis properties, which enable you easily to create, access, query, and modify XML in your code. Литералы XML позволяют записывать XML непосредственно в код.XML literals enable you to write XML directly in your code. Компилятор Visual Basic обрабатывает XML как объект данных первого класса.The Visual Basic compiler treats the XML as a first-class data object.

В приведенном ниже примере кода показано, как создать элемент XML, получить доступ к его дочерним элементам и атрибутам и сделать запросы к содержимому элемента с помощью LINQ.The following code example shows how to create an XML element, access its sub-elements and attributes, and query the contents of the element by using 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

Дополнительные сведения см. в разделе XML.For more information, see XML.

РазделTopic ОписаниеDescription
XMLXML Описывает возможности XML в Visual Basic, которые можно запрашивать и которые позволяют включать XML как объекты данных первого класса в код Visual Basic.Describes the XML features in Visual Basic that can be queried and that enable you to include XML as first-class data objects in your Visual Basic code.
ЗапросыQueries Содержит справочные сведения о предложениях запросов, доступных в Visual Basic.Provides reference information about the query clauses that are available in Visual Basic.
Встроенный язык запросов LINQLINQ (Language-Integrated Query) Содержит общие сведения, рекомендации по программированию и примеры для LINQ.Includes general information, programming guidance, and samples for LINQ.
LINQ to SQLLINQ to SQL Содержит общие сведения, рекомендации по программированию и примеры для LINQ to SQL.Includes general information, programming guidance, and samples for LINQ to SQL.
LINQ to ObjectsLINQ to Objects Содержит общие сведения, рекомендации по программированию и примеры для LINQ to Objects.Includes general information, programming guidance, and samples for LINQ to Objects.
LINQ to ADO.NET (Страница портала)LINQ to ADO.NET (Portal Page) Содержит ссылки на общие сведения, руководства по программированию и примеры для LINQ to ADO.NET.Includes links to general information, programming guidance, and samples for LINQ to ADO.NET.
LINQ to XMLLINQ to XML Содержит общие сведения, рекомендации по программированию и примеры для LINQ to XML.Includes general information, programming guidance, and samples for LINQ to XML.

Практические руководства и пошаговые инструкцииHow to and walkthrough topics

Практическое руководство. Запрос к базе данныхHow to: Query a Database

Практическое руководство. Вызов хранимой процедурыHow to: Call a Stored Procedure

Практическое руководство. Изменение данных в базе данныхHow to: Modify Data in a Database

Практическое руководство. Объединение данных с объединениямиHow to: Combine Data with Joins

Практическое руководство. Сортировка результатов запросаHow to: Sort Query Results

Практическое руководство. Фильтрация результатов запросаHow to: Filter Query Results

Практическое руководство. Данные количества, суммы или среднего значенияHow to: Count, Sum, or Average Data

Практическое руководство. Поиск минимального или максимального значения в результатах запросаHow to: Find the Minimum or Maximum Value in a Query Result

Практическое руководство. Назначение хранимых процедур для выполнения обновлений, вставок и удалений (реляционный конструктор объектов)How to: Assign stored procedures to perform updates, inserts, and deletes (O/R Designer)

Глава 17. LINQ в программировании Visual Basic 2008Chapter 17: LINQ in Programming Visual Basic 2008

См. такжеSee also