Программирование >>  Каркас сущностей ado.net 

1 ... 3 4 5 [ 6 ] 7 8


В следующих разделах мы будем использовать базу данных Formula 1, созданные из которой сущности вы можете видеть на рис. А.7.


Рис. А.7. Сущности базы данных Formula 1

Запросы могут определяться посредством класса ObjectQuery<T>. Начнем с простого запроса для доступа ко всем сущностям Racer. В этом примере соединение уже открыто - передадим его объектному контексту Formula1Entities. Подобным образом можно извлечь сгенерированный SQL-оператор из класса ObjectQuery<Racer> с помощью метода ToTraceString(). Этот метод требует наличия открытого соединения.

ConnectionStringSettings connSettings =

ConfigurationManager.ConnectionStrings[ Formula1Entities ]; EntityConnection connection =

new EntityConnection(connSettings.ConnectionString); connection.Open();

using (Formula1Entities data = new Formula1Entities(connection))

ObjectQuery<Racer> racers = data.Racers;

Console.WriteLine(racers.ConimandText);

Console.WriteLine(racers.ToTraceString());

connection.Close();

Оператор Entity SQL, возвращенный свойством CommandText, показан ниже:

[Racers]



А вот сгенерированный оператор SELECT для извлечения записей из базы данных, показанный методом ToTraceString():

SELECT

[Extent1].[Id] AS [Id], [Extent1].[Firstname] AS [Firstname], [Extent1].[Lastname] AS [Lastname], [Extent1].[Country] AS [Country], [Extent1].[Starts] AS [Starts], [Extent1].[Wins] AS [Wins] FROM [dbo].[Racers] AS [Extent1]

Вместо доступа к свойству Racers из объектного контекста вы можете также создать запрос методом CreateQuery():

ObjectQuery<Racer>racers = data.CreateQuery<Racer>( [Racers] );

Это подобно использованию свойства Racers, и фактически реализация свойства Racers именно таким образом создает запрос.

Теперь будет интересно отфильтровать гонщиков на основании некоторого условия. Это можно сделать с помощью метода Where() класса ObjectQuery<T>. Where() - один из методов Query Builder для создания Entity SQL. Метод требует предиката в виде строки и необязательных параметров типа ObjectParameter. Предикат, показанный здесь, специфицирует, что должны быть возвращены только гонщики из Бразилии (Brazil). it специфицирует элемент результата и страну в столбце Country. Первый параметр конструктора ObjectParameter ссылается на параметр @Country предиката, но не включает символа @.

string country = Brazil ;

ObjectQuery<Racer> racers = data.Racers.Where( it.Country = @Country ,

new ObjectParameter( Country , country));

Магия состоит в том, что it становится видимым немедленно при обращении к свойству CommandText запроса. В Entity SQL конструкция SELECT VALUE it объявляет it для доступа к столбцам.

SELECT VALUE it FROM ( [Racers] ) AS it

WHERE

it.Country = @Country

Метод ToTraceString() отображает сгенерированный SQL-оператор:

SELECT

[Extent1].[Id] AS [Id], [Extent1].[Firstname] AS [Firstname], [Extent1].[Lastname] AS [Lastname], [Extent1].[Country] AS [Country], [Extent1].[Starts] AS [Starts], [Extent1].[Wins] AS [Wins] FROM [dbo].[Racers] AS [Extent1] WHERE [Extent1].[Country] = @Country

Конечно, вы можете также специфицировать полный Entity SQL:

string country = Brazil ;

ObjectQuery<Racer> racers = data.CreateQuery<Racer>(

SELECT VALUE it FROM ([Racers]) AS it WHERE it.Country = @Country , new ObjectParameter( Country , country));



Класс ObjectQuery<T> предоставляет несколько методов Query Builder, описанных в табл. А.5. Многие из этих методов очень похожи на расширяющие методы LINQ, о которых вы узнали в главе 11.

Таблица А.5. Методы Query Builder ObjectQuery<T>

Методы

ObjectQuery<T>

Where() Distinct() Except()

GroupBy()

Include()

OfType() OrderBy()

Select() SelectValue()

Skip() Top()

Intersect( Union() UnionAll()

Описание

Этот метод позволяет вам фильтровать результаты на основании условия.

Этот метод создает запрос с уникальными результатами.

Этот метод возвращает результат без элементов, отвечающих условию фильтра except.

Этот метод создает новый запрос для группирования сущностей на основе определенного критерия.

В показанном ранее отношении, когда выполняется отложенная загрузка связанных элементов, требовался вызов метода Load() класса EntityCollection<T> для получения связанных сущностей в объектный контекст. Вместо использования метода Load() вы можете специфицировать запрос методом Include() для принудительного извлечения связанных сущностей.

Этот метод специфицирует возврат только сущностей определенного типа. Это очень удобно для отношений TPH.

Этот метод предназначен для определения порядка сортировки сущностей.

Эти методы возвращают проекцию результатов. Select() возвращает результирующие элементы в форме DbDataRecord; SelectValue() возвращает их в скалярном виде или в виде сложных типов, как определено обобщенным параметром TResultType.

Эти методы удобны для разбиения на страницы. Пропускайте нужное число элементов методом Skip() и берите заданное число элементов методом Top().

Эти методы используются для комбинации двух запросов. Intersect() возвращает запрос, содержащий только те результаты, что доступны для обоих запросов. Union() комбинирует запросы и возвращает полный результат без дубликатов. UnionAll() также включает дубликаты.

Давайте рассмотрим один пример использования методов Query Builder. Здесь гонщики фильтруются методом Where() для возврата только тех из них, кто из США; метод OrderBy() специфицирует порядок сортировки по убыванию - сначала по количеству побед, а затем по числу стартов. И, наконец, только первые три гонщика попадают в результат посредством метода Top() .

using (Formula1Entities data = new Formula1Entities())

string country = USA ;

ObjectQuery<Racer> racers = data.Racers.Where( it.Country = @Country , new ObjectParameter( Country , country)) .OrderBy( it.Wins DESC, it.Starts DESC ) .Top( 3 );

foreach (var racer in racers)

Console.WriteLine( {0} {1}, wins: {2}, starts: {3} , racer.Firstname, racer.Lastname, racer.Wins, racer.Starts);



1 ... 3 4 5 [ 6 ] 7 8

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика