Советы по использованию LINQ to SQL
45LINQ --- LINQ to DataSet и SQL --- Советы по использованию LINQ to SQL
»» В ДАННОЙ СТАТЬЕ ИСПОЛЬЗУЕТСЯ ИСХОДНЫЙ КОД ДЛЯ ПРИМЕРОВ
Используйте свойство DataContext.Log
Свойство Log объекта DataContext используется для отображения транслированного запроса SQL. Это может быть очень полезно не только в целях отладки, но и для анализа производительности. Вы можете обнаружить, что запросы LINQ to SQL транслируются в очень неэффективные запросы SQL. Или же выяснить, что из-за отложенной загрузки ассоциированных сущностных классов приходится выполнять больше SQL-запросов, чем необходимо. Свойство DataContext.Log обеспечит получение такой информации.
Чтобы воспользоваться преимуществами этого средства, необходимо просто присвоить свойству DataContext.Log объект System.IO.TextWriter, такой как Console.Out. Пример приведен ниже:
Northwind db = new Northwind(
@"Data Source=MICROSOF-1EA29E\SQLEXPRESS;
Initial Catalog=C:\MYPROJECT\LINQ TO DATASET AND SQL\LINQ TO DATASET AND SQL\EXTENDED NORTHWIND DATABASE\NORTHWIND.MDF;
Integrated Security=True");
db.Log = Console.Out;
var custs = from c in db.Customers
where c.Region == "WA"
select new { Id = c.CustomerID, Name = c.ContactName };
foreach (var cust in custs)
{
Console.WriteLine("{0} - {1}", cust.Id, cust.Name);
}
Как видите, свойству Log объекта DataContext по имени Northwind присваивается Console.Out. Вот результат работы примера:
Это позволяет увидеть в точности, как выглядит сгенерированный SQL-запрос. Обратите внимание, что сгенерированный оператор SQL — это не просто форматированная строка, он использует параметры. Поэтому, применяя LINQ to SQL, мы автоматически получаем защиту от атак внедрением SQL.
В нескольких примерах из следующих статей будет продемонстрировано использование этого средства протоколирования для обнаружения потенциальных проблем, связанных с производительностью.
Используйте метод GetChangeSet()
Метод GetChangeSet() объекта DataContext можно использовать для получения всех сущностных объектов, содержащих изменения, которые должны быть сохранены в базе данных при вызове SubmitChanges. Это удобно для протоколирования и отладки.
Использование частичных классов или файлов отображения
Без сомнений, одной из главных трудностей использования любого инструмента ORM является управление изменениями в базе данных. Если вы держите всю логику бизнес-классов и логику LINQ to SQL в одних и тех же модулях, то этим создаете себе проблемы сопровождения при изменениях базы данных.
Рассмотрите возможность применения частичных классов, помещая бизнес-логику в модуль, отдельный от модулей сгенерированных сущностных классов. Используя частичные классы для хранения ваших атрибутов базы данных LINQ to SQL отдельно от бизнес-логики, вы минимизируете необходимость в добавлении кода к любому сгенерированному сущностному классу.
В качестве альтернативы можно разделить бизнес-классы и отображение сущностей LINQ to SQL с помощью внешнего XML-файла отображения. Речь идет об XML-файле, который отображает бизнес-объекты на базу данных, не полагаясь на атрибуты LINQ to SQL.
Использование частичных методов
Частичные методы позволяют вмешиваться в определенные события, которые происходят в сущностных классах. Изящество их в том, что если тело частичного метода решено не реализовывать, то при этом не возникнет никаких накладных расходов, и компилятор не будет генерировать код, связанный с их вызовом.