Типовые операции при работе с Entity Framework

Вт 01 Декабрь 2009 by levap

Entity Framework представляет собой систему ORM (Object-Relational Mapping), которая позволяет разработчикам работать с данными, используя объектную модель вместо логической или реляционной модели данных. В данной статье я не буду рассматривать основы данной ORM, ее структуру и возможности, а приведу лишь практические примеры типовых операций с данными. Все примеры написаны на языке C#.

  1. Получение количества записей в таблице без загрузки ее содержимого:
[c]
// componentSet - объектное представление таблицы
using (dbEntities Context = new dbEntities())
{
var count = Context.componentSet.Count();
}
[/c]

2. Получение количества записей в связанной таблице без загрузки ее содержимого:

[c]
// labelSet - таблица 1, ключевое поле id (Guid)
// components - навигационной свойство, связывающее таблицу label и таблицу component
using (dbEntities Context = new dbEntities())
{
var count = Context.labelSet
.Where(lb => lb.id == guid) // выбор записи с ключом guid
.SelectMany(lb => lb.components)
.Count();
}
[/c]

3. Выборка записей с N по M динамически отсортированных по двум столбцам:

[c]
// Order - вариант сортировки
// Skip - пропустить записей
// Take - выбрать записей
// componentSet - таблица
// cp_... - поля таблицы
using (dbEntities Context = new dbEntities())
{
var items = Context.componentSet.AsQueryable();
switch (Order)
{
case (1):
items = items
.OrderBy(p => p.cp_value)
.ThenBy(p => p.cp_name);
break;
case (2):
items = items
.OrderBy(p => p.cp_box)
.ThenBy(p => p.cp_name);
break;
default:
items = items
.OrderBy(p => p.cp_name)
.ThenBy(p => p.cp_value);
break;
}
List<components> Result = items.AsEnumerable().Select(p => new component
{
id = p.id,
cp_name = p.cp_name,
cp_value = p.cp_value,
cp_box = p.cp_box,
}).Skip(Skip).Take(Take).ToList();
}
[/c]

То же самое для связанных таблиц:

[c]
// Order - вариант сортировки
// Skip - пропустить записей
// Take - выбрать записей
// componentSet - таблица 1
// labelSet - таблица 2
// cp_... - поля таблицы 1
using (dbEntities Context = new dbEntities())
{
var label =
(from lb in Context.labelSet
where lb.id == guid
select lb).FirstOrDefault();

if (label == null) throw new Exception("Wrong GUID");

var items = label.components.CreateSourceQuery().AsQueryable();
switch (Order)
{
case (1):
items = items
.OrderBy(p => p.cp_value)
.ThenBy(p => p.cp_name);
break;
case (2):
items = items
.OrderBy(p => p.cp_box)
.ThenBy(p => p.cp_name);
break;
default:
items = items
.OrderBy(p => p.cp_name)
.ThenBy(p => p.cp_value);
break;
}
List<components> Result = items.AsEnumerable().Select(p => new component
{
id = p.id,
cp_name = p.cp_name,
cp_value = p.cp_value,
cp_box = p.cp_box,
}).Skip(Skip).Take(Take).ToList();
}
[/c]
  1. Удаление записи:
[c]
// componentSet - таблица
// guid - ключ записи
using (dbEntities Context = new dbEntities())
{
var item =
(from tb in Context.componentSet
where tb.id == guid
select tb).FirstOrDefault(); if (item == null) throw new Exception("Wrong GUID");
Context.DeleteObject(item);
Context.SaveChanges();
}
[/c]
  1. Добавление новой записи:
[c]
// Name, Value, Box - значения полей
// cp_... - поля таблицы
using (dbEntities Context = new dbEntities())
{
var item = new component();
// Auto
item.id = Guid.NewGuid();
item.cp_date_create = DateTime.Today;
// Manual
item.cp_name = Name;
item.cp_value = Value;
item.cp_box = Box;
Context.AddTocomponentSet(item);
Context.SaveChanges();
}
[/c]
  1. Редактирование записи
[c]
// Name, Value, Box - новые значения полей
// cp_... - поля таблицы
using (dbEntities Context = new dbEntities())
{
var item =
(from tb in Context.componentSet
where tb.id == guid
select tb).FirstOrDefault();

if (item == null) throw new Exception("Wrong GUID");

// Auto
item.cp_date_update = DateTime.Today;
// Manual
item.cp_name = Name;
item.cp_value = Value;
item.cp_box = Box;
Context.SaveChanges();
}
[/c]

На этом пока все. Удачи!