Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
запросы Language-Integrated (LINQ) работают с источниками данных, реализующими интерфейс IEnumerable<T> или интерфейс IQueryable<T>. Класс DataTable не реализует ни один интерфейс, поэтому необходимо вызвать метод AsEnumerable, если вы хотите использовать DataTable в качестве источника в предложении From
запроса LINQ.
Следующий пример получает все онлайн-заказы из таблицы SalesOrderHeader и выводит идентификатор заказа, дату заказа и номер заказа в консоль.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);
DataTable orders = ds.Tables["SalesOrderHeader"];
var query =
from order in orders.AsEnumerable()
where order.Field<bool>("OnlineOrderFlag") == true
select new
{
SalesOrderID = order.Field<int>("SalesOrderID"),
OrderDate = order.Field<DateTime>("OrderDate"),
SalesOrderNumber = order.Field<string>("SalesOrderNumber")
};
foreach (var onlineOrder in query)
{
Console.WriteLine($"Order ID: {onlineOrder.SalesOrderID} Order date: {onlineOrder.OrderDate:d} Order number: {onlineOrder.SalesOrderNumber}");
}
' Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
' See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)
Dim orders As DataTable = ds.Tables("SalesOrderHeader")
Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of Boolean)("OnlineOrderFlag") = True _
Select New With { _
.SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
.OrderDate = order.Field(Of DateTime)("OrderDate"), _
.SalesOrderNumber = order.Field(Of String)("SalesOrderNumber") _
}
For Each onlineOrder In query
Console.Write("Order ID: " & onlineOrder.SalesOrderID)
Console.Write(" Order date: " & onlineOrder.OrderDate)
Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)
Next
Локальный запрос переменной инициализируется выражением запроса, которое работает с одним или несколькими источниками информации, применяя один или несколько операторов запросов из стандартных операторов запросов или, в случае LINQ to DataSet, операторы, относящиеся к классу DataSet. Выражение запроса в предыдущем примере использует два стандартных оператора запроса: Where
и Select
.
Предложение Where
фильтрует последовательность в зависимости от условия, в этом случае OnlineOrderFlag
равно true
. Оператор Select
выделяет и возвращает перечислимый объект, который фиксирует аргументы, переданные оператору. В этом примере анонимный тип создается с тремя свойствами: SalesOrderID
, OrderDate
и SalesOrderNumber
. Значения этих трех свойств задаются значениями столбцов SalesOrderID
, OrderDate
и SalesOrderNumber
из таблицы SalesOrderHeader
.
Затем цикл foreach
перечисляет перечисляемый объект, возвращаемый Select
, и возвращает результаты запроса. Так как запрос является типом Enumerable, который реализует IEnumerable<T>, оценка запроса откладывается, пока переменная запроса не будет итерирована с помощью цикла foreach
. Отложенная оценка запросов позволяет хранить запросы в качестве значений, которые можно оценивать несколько раз, каждый раз, возвращая потенциально разные результаты.
Метод Field предоставляет доступ к значениям столбцов DataRow, а SetField (не показанный в предыдущем примере) задает значения столбцов в DataRow. Методы Field и SetField обрабатывают тип значения с нулевыми значениями, поэтому не нужно явно проверять нулевые значения. Оба метода являются универсальными методами, а это означает, что приведение возвращаемого типа не требуется. Вы можете использовать предварительно существующий метод доступа к столбцам в DataRow (например, o["OrderDate"]
), но для этого потребуется привести возвращаемый объект к соответствующему типу. Если столбец является типом значения, допускающим NULL, необходимо проверить, является ли значение NULL с помощью метода IsNull. Дополнительные сведения см. в разделе Универсальные поля и методы SetField.
Обратите внимание, что тип данных, указанный в универсальном параметре T
метода Field и метода SetField, должен соответствовать типу базового значения, иначе будет выброшено InvalidCastException. Указанное имя столбца также должно соответствовать имени столбца в DataSet, иначе возникнет ArgumentException. В обоих случаях исключение выбрасывается во время перечисления данных при выполнении запроса.