Обзор 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.