Обзор ADO.NET Entity Framework - Использование LINQ to Entities
ОГЛАВЛЕНИЕ
Использование LINQ to Entities
С помощью служб Object Services можно выполнять динамические запросы, написанные на Entity SQL, для взаимодействия с сущностями EDM. Но в Entity Framework также можно работать со строго типизированными классами EDM, используя LINQ to Entities. Например, в только что продемонстрированном примере запрос на Entity SQL через Object Services может быть изменен для выполнения на LINQ to Entities, вот так:
string city = “London”;
var query = from c in northwindContext.Customers
where c.City == city
select c;
foreach (Customers c in query) Console.WriteLine(c.CompanyName);
В этом примере кода весь основанный на тексте синтаксис Entity SQL заменен на строго типизированный синтаксис LINQ, поддерживаемый в C# 3.0. Более подробная информация о LINQ и его поддержке в C# и Visual Basic® доступна в июньском выпуске MSDN Magazine за 2007 г. по адресу msdn.microsoft.com/msdnmag/issues/07/06.
Теперь вспомните, как я создал в EDM тип EntityType, называющийся DiscontinuedProducts, произведенный от Products. Возможности EDM по наследованию могут быть использованы совместно с LINQ и Object Services для получения списка продуктов, которые больше не поддерживаются. Обратите внимание, что в следующем примере не указывается, что значение поля Discontinued должно быть равно 1. Вместо этого, тип для сущности продукта сверяется с производным EntityType DiscontinuedProducts, что в свою очередь задействует условие, которое я создал в сопоставлении (файле MSL), чтобы создать подходящее выражение SQL для получения только неподдерживаемых продуктов:
var query = from p in northwindContext.Products
where p is DiscontinuedProducts
select p;
foreach (Products p in query) Console.WriteLine(p.ProductName);
Вы можете также создавать запросы, использующие преимущества встроенных отношений EDM (определяемых набором AssociationSet). Например, список заказов для заказчиков из Лондона может быть получен посредством следующего выражения запроса LINQ:
var query = from o in northwindContext.Orders
where o.Customers.City == “London”
select o;
foreach (Orders o in query) Console.WriteLine(o.OrderID);
Этот пример кода начинается с сущности Orders и использует ее свойство перемещения Customers для просмотра свойства City. Заказы от заказчиков не из Лондона полностью отфильтровываются. Поскольку возвращается список сущностей Orders, сущности могут быть изменены, и изменения могут быть сохранены в базе данных. Сохранение изменений в базе данных может быть выполнено при помощи метода SaveChanges.
Следующий пример получает список заказчиков из Лондона и устанавливает значение свойства Country для каждого из них в «United Kingdom». Изменения сохраняются в StateManager, но не заносятся в базу данных, пока не вызывается метод SaveChanges:
var query = from c in northwindContext.Customers
where c.City == “London”
select c;
foreach (Customers c in query) c.Country = “United Kingdom”;
northwindContext.SaveChanges();
Вы также можете создать новый экземпляр сущности и добавить его в EDM, используя метод AddObject объекта ObjectContext. В следующем примере показано, как добавить новую категорию в таблицу базы данных Categories:
Categories newCat = new Categories();
newCat.CategoryName = “Other”;
northwindContext.AddObject(newCat);
northwindContext.SaveChanges();
int newCatID = newCat.CategoryID;
Сперва создается экземпляр сущности Categories и устанавливается значение его свойства CategoryName. Затем новая категория добавляется в EDM вызовом метода AddObject. Когда вызывается метод SaveChanges, создается оператор SQL, который сохраняет новую Category в базе данных и возвращает идентификатор CategoryID для новой строки.
Когда между сущностями есть связи, вам может потребоваться ассоциировать новую сущность с уже существующей. Например, можно создать новую сущность Orders и связать ее свойство Customers с существующей сущностью Customers. Хотя в таблице Orders в базе данных есть поле CustomerID, EDM представляет эту связь в объектно-ориентированном стиле, используя свойство Customers для обращения к существующей сущности Customers:
Orders newOrder = new Orders();
newOrder.OrderDate = DateTime.Today;
Customers cust = northwindContext.Customers.Where(
“it.CustomerID = ‘ALFKI’”).First();
newOrder.Customers = cust;
northwindContext.AddObject(newOrder);
northwindContext.SaveChanges();
Заключение
Entity Framework позволяет разработчикам обращаться к данным, используя объектную модель вместо логической или реляционной модели данных. Разработав EDM и сопоставление реляционному хранилищу, можно взаимодействовать с объектами различными способами: EntityClient, ObjectServices и LINQ.
Хотя традиционные объекты, такие как DataSet, DataAdapter, DbConnection и DbCommand по-прежнему поддерживаются в следующем выпуске ADO.NET, доступном в Visual Studio «Orcas», Entity Framework привносит значительные дополнения, открывающие для ADO.NET новые удивительные возможности.
Джон Папа – старший консультант по .NET в компании ASPSOFT (aspsoft.com) и страстный поклонник бейсбола, который почти все летние вечера проводит, болея за «Янки» со своим семейством и верным псом Кади. Джон, MVP по языку C#, является автором нескольких книг по ADO, XML и SQL Server.