Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #71, ОКТЯБРЬ 2006 г.

орки наступают

БОРИС ВОЛЬФСОН

Спецвыпуск: Хакер, номер #071, стр. 071-060-5


Fax = null

};

db.Customers.Add(newCustomer);

db.SubmitChanges();

Console.WriteLine();

Console.WriteLine("*** AFTER ***");

ObjectDumper.Write(q);

Существует очень интересный механизм, который позволяет ускорить работу приложения и сократить его код – хранимые процедуры, или просто «хранимки». «Хранимка» - это откомпилированный код программы на SQL, который можно вызвать по имени и передать параметры. За счет чего достигается скорость, думаю, понятно, - откомпилированный код всегда исполняется быстрее интерпретируемого. Использовать «хранимки» стало довольно просто – достаточно обратиться к соответствующему методу:

int count = db.CustomersCountByRegion("WA");

Console.WriteLine(count);

Код очень короткий и быстрый. Чтобы понять механизм работы, посмотрим текст самой хранимой процедуры. Она принимает один строковый параметр, который считается регионом, затем делает запрос на выборку с подсчетом.

ALTER PROCEDURE dbo.[Customers Count By Region]

(@param1 NVARCHAR(15))

AS

BEGIN

SET NOCOUNT ON;

DECLARE @count int

SELECT @count = COUNT(*)FROM Customers WHERE Customers.Region = @Param1

RETURN @count

END

Те, кто работает с базами данных сейчас, наверняка используют классы DataSet. Хочу отметить, что весь код - под третью версию языка C#, так как LINQ отлично работает и с ними. Необходимо привести DataSet к нужному интерфейсу, а сам запрос практически не отличается от обычных.

var numbers = testDS.Tables["Numbers"].ToQueryable();

var lowNums = from n in numbers

where n.Field<int>("number") < 5

select n;

Console.WriteLine("Numbers < 5:");

foreach (var x in lowNums) {

Console.WriteLine(x[0]);

}

[напоследок.]

Напишем код, который объединяет в себе все выше описанное. В качестве формата хранения данных выберем XML. Загрузим файл bib.xml, который есть в стандартной поставке LINQ. Он хранит информацию о книгах, из которой мы выдернем нужную нам. Выбирать будем книги, которые выпустило издательство Addison-Wesley после 1995 года. Результат в виде XML-файла выведем на консоль.

XDocument bib = XDocument.Load(“bib.xml");

var result = new XElement("bib",

from b in bib.Element("bib").Elements("book")

where (string)b.Element("publisher") == "Addison-Wesley" &&

(int)b.Attribute("year") > 1995

select new XElement("book",

new XAttribute("year",b.Attribute("year").Value),

b.Element("title")));

Console.WriteLine(result);

Таким методом можно извлекать данные из базы и упаковывать в массив или наоборот.

[завершаем.]

Главное значения LINQ – это облегчить программистам работу с данными. Теперь контейнеры, XML и базы данных обрабатываются единообразно, и мы можем получать данные из хранилища одного типа (или сразу нескольких) и класть в хранилище другого типа. Надеюсь, благодаря этому программы, которые работают с данными (то есть все программы :) ), станут короче, а код у них чище!

Назад на стр. 071-060-4  Содержание  Вперед на стр. 071-060-6