conn.Close();
Данный пример инициализирует строку соединения с базой данных и открывает соединение. Затем создает команду в виде SQL-запроса на чтение всех записей из таблицы Customers
(заказчики). С помощью ExecuteReader
команда выполняется, и для работы с данными строится объект SqlDataReader
. После этого формируется цикл, который проходит по всем записям, ищет первую запись с именем Сергей Петров и прерывает цикл, сохраняя данные о телефоне в локальной переменной.
Для сравнения перепишем этот простой пример, используя LINQ для Dataset:
SqlConnection conn = new SqlConnection(@"
Data Source=localhost;
Initial Catalog=BookMVC;
Integrated Security=True");
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Customers", conn);
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(ds);
DataTable customers = ds.Tables[0];
string phone = customers. AsEnumerable()
.Where(x => x.Field<string>("name") == "Сергей Петров")
.Select(x => x.Field<string>("phone")).SingleOrDefault();
conn.Close();
Как нетрудно заметить, наш цикл, нацеленный на поиск данных, исчез, и ему на замену пришло LINQ-выражение, которое выполняет точно ту же логику — ищет телефон по определенному номеру.
Механизм доступа к данным через ADO.NET Dataset в общем случае производительнее, чем через ORM, вроде LINQ для SQL или Entity Framework, поскольку при работе с объектами типа Dataset
нет затрат на реализацию объектной модели базы данных. Работа с данными происходит напрямую через SQL-запросы или вызов хранимых процедур. Разработчик сам контролирует весь процесс получения и использования данных, что дает больше возможностей и прирост производительности, но с другой стороны, увеличивает объем написания необходимого кода.
Поскольку основная часть времени при запросе тратится на его выполнение, то использование ADO.NET вместо популярных ORM для доступа к данным оправдано только там, где ставятся повышенные требования к потреблению памяти и производительности. В большинстве же случаев затраты на ORM окупаются скоростью и простотой разработки, единой моделью доступа к данным и меньшему количеству кода.
LINQ для SQL
Работа с LINQ для SQL на платформе .NET Framework осуществляется с помощью классов пространства имен System.Linq и System.Data.Linq.
Перечислим основные классы этих пространств имен.
□ System.Linq:
• Enumerable
— предоставляет набор статичных методов для работы с объектами, реализующими интерфейс IEnumerable<T>.
• Queryable
— предоставляет набор статичных методов для работы с объектами, реализующими интерфейс IQueryable<T>.
Методы этих классов, вроде Where, Select, Sum
и др., используются в любом LINQ-выражении для построения запросов, обработки и фильтрации данных.
□ System.Data.Linq:
• DataContext
— основной объект для работы с LINQ для SQL, предоставляет контекст базы данных, через который осуществляется доступ ко всем сущностям базы данных;
• EntitySet<TEntity>, EntityRef<TEntity>
(структура) — обеспечивают связь между сущностями в LINQ для SQL;
• Table<TEntity>
— представляет таблицу с возможностью изменения объектов;
• CompiledQuery
— предоставляет возможность компилировать и повторно использовать запросы.
Контекст базы данных, наследующий от класса DataContext
, в LINQ для SQL принято создавать с помощью мастера, который автоматически сгенерирует LINQ для SQL-классов. После такой генерации работа с объектной моделью становится очень простой, например, приведенный в разделе ADO.NET пример в исполнении LINQ для SQL будет выглядеть так:
using (MyDatabaseDataContext dataContext = new MyDatabaseDataContext())
{
string phone = dataContext.Customers
.Where(x => x.name == "Сергей Петров")
.FirstOrDefault().phone;
}
Согласитесь, это заметно более простое решение по сравнению с вариантом, написанным с использованием ADO.NET Dataset.
Entity Framework
Entity Framework можно использовать только на .NET Framework версии 3.5 с установленным пакетом обновления SP1. Для работы с Entity Framework предлагаются следующие пространства имен: System.Data.Entities, System.Data.Objects, System.Data.EntityClient и др.
В отличие от LINQ для SQL модель данных Entity Framework (EDM) состоит из трех частей:
□ концептуальная модель (CSDL) — позволяет создавать сущности, не равнозначные сущностям базы данных, например, комплексные сущности, состоящие из элементов нескольких таблиц, или сущности, наследующие от других сущностей;