Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка приложений баз данных (Visual Studio 2008).docx
Скачиваний:
143
Добавлен:
26.03.2016
Размер:
1.01 Mб
Скачать

Запросы к одиночным таблицам (linq to DataSet)

Запросы LINQ (Language-Integrated Query) работают с источниками данных, которые реализуют интерфейс IEnumerable<T>или интерфейс IQueryable.КлассDataTableне реализует ни один из этих интерфейсов, в связи с этим необходимо вызывать методAsEnumerable, если в качестве источника в предложении From запроса LINQ используетсяDataTable.

В следующем примере получаются все активные заказы из таблицы SalesOrderHeader и выводится на консоль идентификатор, дата и номер заказа.

C#

// 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: {0} Order date: {1:d} Order number: {2}",

onlineOrder.SalesOrderID,

onlineOrder.OrderDate,

onlineOrder.SalesOrderNumber);

}

Запрос локальной переменной инициализирован выражением запроса, которое работает с одним или несколькими источниками данных, путем выполнения одного или нескольких стандартных операторов запроса или, как в случае 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, обрабатывают типы, допускающие значения NULL, поэтому нет необходимости явно проводить проверку на значения NULL.Оба метода являются универсальными методами, что означает, что нет необходимости приводить возвращаемый тип.ВDataRowнужно использовать предопределенный метод доступа к столбцам (например,o["OrderDate"]), однако в этом случае приведение возвращаемого объекта к соответствующему типу обязательно.Если столбец допускает значение NULL, необходимо проверить его на значение NULL, используя методIsNull.Дополнительные сведения см. в разделеУниверсальные методы Field и SetField (LINQ to DataSet).

Обратите внимание, что тип данных, определяемый в универсальном параметре T методов FieldиSetField, должен соответствовать типу базового значения, иначе сформируется исключениеInvalidCastException.Указанное имя столбца должно совпадать с именем столбца вDataSet, иначе это вызовет исключениеArgumentException.В обоих случаях исключении возникает при перечислении данных во время выполнения в момент выполнения запроса.

См. также

Основные понятия

Перекрестные запросы между таблицами (LINQ to DataSet)

Запрос к типизированным объектам DataSet

Универсальные методы Field и SetField (LINQ to DataSet)