Программирование >>  Программирование с использованием ajax 

1 ... 283 284 285 [ 286 ] 287 288 289 ... 396


Пока не нажимайте <Enter>; оставьте экран консоли на месте и прочтите следующий раздел Описание полученных результатов , чтобы разобраться в сгенерированном выводе.

Описание полученных результатов

Метод ToString () по умолчанию для запроса LINQ to SQL печатает сгенерированный SQL, поэтому то, что вы видите - это вывод вызова Console.WriteLine ( totalResults). Не правда ли, можно порадоваться, что вам не пришлось писать это самостоятельно?

Эта команда SQL будет передана SQL Server для возврата результатов в LINQ to SQL, который транслирует конструкции LINQ select, from и where в соответствующие конструкции SQL - SELECT, FROM и WHERE. Кроме того, агрегатная операция LINQ Sum () транслируется в вызов агрегатной операции SQL SUM ().

Действие этих функций SQL достаточно схоже с эквивалентными функциями LINQ, поэтому мы не станем их объяснять подробно; однако имейте в виду, что не все конструкции или методы LINQ транслируются однозначно в эквиваленты SQL. Просто так случилось, что этот запрос почти точно переводится на SQL, с небольшими поправками вроде вызова функции SQL CONVERT () для преобразования корректного типа данных decimal для столбца Sales результата и добавления конструкций SQL WHERE для соединения результатов таблиц Order Details, Orders и Customers по значениям полей Order ID и CustomerlD; обо всех этих запутанных деталях SQL позаботится LINQ to SQL.

Обратите также внимание, что этот запрос SQL еще не выполнился - благодаря отложенному выполнению запросов LINQ- и эту отображенную команду SQL каркас LINQ to SQL только тогда отправит на SQL Server, когда запрос действительно нужно будет выполнить (при запуске цикла foreach по результатам). Теперь нажмите <Enter>, чтобы увидеть следующий экран сгенерированного кода SQL для группового запроса:

------ SQL для запроса groupResults --------

SELECT SUM([t4].[value]) AS [value], [t4].[Country] FROM (

SELECT [tO].[Country], ( SELECT SUM([t4].[value]) FROM (

SELECT SUM([t3]. [value]) (

SELECT SUM( (CONVERT(Decimal(29,4) , [t2].[Quantity])) * [t2].[UnitPrice])

FROM [dbo].[Order Details] AS [t2]

WHERE [t2] .[OrderlD] = [ tl ] .[OrderlD] ) AS [value], [tl].[CustomerlD] FROM [dbo].[Orders] AS [tl] ) AS [t3]

WHERE [t3].[CustomerlD] = [tO].[CustomerlD] ) AS [value]

FROM [dbo].[Customers] AS [tO] ) AS [t4]

GROUP BY [t4] . [Country]

Для продолжения нажмите Enter.. .

Обратите внимание, что SQL для группового запроса содержит тот же SQL, который вы только что видели в запросе суммарных результатов внутри него; и поскольку его источник данных - totalResults, как указано в конструкции from (from с in totalResults), он помещает SQL для запроса totalResults во внешний запрос SQL с конструкцией GROUP BY:



SELECT SUM([t4].[value]) AS [value], [t4].[Country] FROM (

. . . SQL для totaResults . . . ) AS [t4]

GROUP BY [t4] . [Country]

Опять-таки, это еще не посылается на сервер; поскольку вы передаете эти результаты еще одному вложенному запросу, то тем самым по существу строите единственную сложную команду SQL со множеством запросов LINQ to SQL. Теперь нажмите <Enter>, чтобы увидеть следующий экран сгенерированного SQL:

------ SQL для запроса orderedResults --------

SELECT [t5].[value] AS [TotalSales], [t5].[Country] FROM (

SELECT SUM([t4] . [value]) AS [value], [t4]. [Country] FROM (

SELECT [tO].[Country], ( SELECT SUM([t3].[value]) FROM ( SELECT (

SELECT SUM((CONVERT(Decimal(29,4), [t2].[Quantity])) * [t2].[UnitPrice])

FROM [dbo].[Order Details] AS [t2]

WHERE [t2].[OrderlD] = [tl].[OrderlD] ) AS [value], [tl].[CustomerlD] FROM [dbo].[Orders] AS [tl] ) AS [t3]

WHERE [t3].[CustomerlD] = [tO].[CustomerlD] ) AS [value]

FROM [dbo].[Customers] AS [tO] ) AS [t4]

GROUP BY [t4] . [Country] ) AS [t5]

ORDER BY [t5].[value] DESC Для продолжения нажмите Enter

Как и ранее, этот запрос SQL содержит SQL для предшествующего запроса внутри него. Он помещает результат GROUP BY в запрос QUERY BY:

SELECT [t5].[value] AS [TotalSales], [t5].[Country] FROM (

. . . SQL for groupResults . . . ) AS [t5]

ORDER BY [t5].[value] DESC

И это все еще не посылается на сервер; однако когда вы нажмете следующий раз <Enter>, то запустите цикл foreach по результату запроса queryby, инициируя непосредственное выполнение этого запроса SQL. Из-за отложенного выполнения только один запрос SQL в действительности отправляется на сервер базы данных, что почти всегда более эффективно, чем обработка результатов множества запросов.

Эффективность выполнения запроса SQL зависит от оптимизатора запросов, встроенного в большинство современных SQL-серверов баз данных - он проанализирует вложенные подзапросы и построит план выполнения, который выполнит его наиболее оптимальным образом. Хотя одни оптимизаторы запросов SQL лучше других, все же наиболее современные из них справляются с этой задачей лучше среднего программиста, поэтому вполне оправдано доверять LINQ to SQL и базе SQL выполнение наиболее трудной работы.



Хотя и неплохо все-таки знать, какой SQL генерируется, и иметь возможность сообщить его экспертам по SQL в вашей организации, но благодаря LINQ to SQL вам не придется создавать SQL самостоятельно.

Если возникает потребность в выполнении некоторых специфичных запросов SQL к базе данных, взгляните на классы ADO.NET, описанные в следующей главе, которые предназначены для того, чтобы позволить специфицировать любой SQL, который будет отправляться серверу. LINQto SQL также предусматривает метод ExecuteQuery () в классе DataContext для базы данных - специально для тех ситуаций, когда вы, прежде всего, хотите использовать сгенерированный LINQ to SQL код SQL, но время от времени посылать специфические команды SQL в базу данных.

Далее вы узнаете о другом способе, которым Visual С# 2008 и LINQ to SQL облегчает работу, когда речь пойдет о том, как можно генерировать пользовательский интерфейс, привязанный к запросам базы данных, с очень небольшими усилиями с вашей стороны.

Привязка данных с LINQ to SQL

Для того чтобы конечные пользователи могли взаимодействовать с приложением базы данных, вы должны спроектировать набор форм для ввода данных, а также отчетов для их вывода.

Традиционно это требует большого объема утомительного кодирования для обновления бизнес-объектов из форм GUI с последующим вызовом методов на бизнес-уровне для запросов и обновления базы данных в результате просмотра пользователем данных, их ввода и обновления.

Ранее вы видели, как 0/R Designer генерирует классы LINQ to SQL для обработки чтения базы данных и навигации по отношениям. Но для вас есть и другие хорошие новости!

Visual С# 2008 включает привязку данных в визуальных конструкторах форм, которая работает с LINQ to SQL, так что писать детализированный код для получения данных от форм конечного пользователя и помещения их в классы базы данных не придется. Вы можете лишь указывать и щелкать в визуальном конструкторе форм Visual С# 2008, чтобы сгенерировать код для изощренных графических приложений баз данных, которые прекрасно работают, практически не требуя ручного кодирования. В следующем практическом занятии вы увидите, как это работает.

Практическое заняти, ПривЯЗКа ДЭННЫХ С LINQ tO SQL

Для создания примера выполните следующие шаги в Visual С# 2008.

1. Создайте новый проект Windows Forms по имени BegVCSharp 27 2 LINQtoSQLDataBinding в каталоге С: \BegVCSharp\Chapter27.

2. Добавьте класс LINQ to SQL Northwind.dbml и подключитесь к базе данных Northwind, как это делалось в первом примере запроса LINQ to SQL в самом начале главы.

Если вам нужно напоминание о том, как это делается, вернитесь к практическому занятию Первый запрос LINQ to SQH в начале этой главы и повторите шаги с 3 по 13.

3. Перетащите таблицы Customers и Orders в Northwind.dbml в 0/R Designer. Экран проекта должен выглядеть, как показано на рис. 27.17.



1 ... 283 284 285 [ 286 ] 287 288 289 ... 396

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