|
Программирование >> Программирование с использованием ajax
Пока не нажимайте <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.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |