Советы по использованию LINQ to SQL

45

»» В ДАННОЙ СТАТЬЕ ИСПОЛЬЗУЕТСЯ ИСХОДНЫЙ КОД ДЛЯ ПРИМЕРОВ

Используйте свойство 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. Вот результат работы примера:

Пример использования свойства DataContext.Log

Это позволяет увидеть в точности, как выглядит сгенерированный 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.

Использование частичных методов

Частичные методы позволяют вмешиваться в определенные события, которые происходят в сущностных классах. Изящество их в том, что если тело частичного метода решено не реализовывать, то при этом не возникнет никаких накладных расходов, и компилятор не будет генерировать код, связанный с их вызовом.

Пройди тесты
Лучший чат для C# программистов