Как создать вычислимое поле в модели Code First Entity Framework 6?

Добрый день.

Создаю модель данных Code First в Entity Framework 6. Появилась необходимость создать у сущности вычислимое свойство. Например, количество по документу есть сумма количеств по всем его строкам, потому хранить такое поле в таблице неправильно. На SQL я бы написал:

select *
, coalesce((select sum(r.Quantity) from DocumentRows r where r.document_id=d.id), 0) as Quantity
from Documents d
where

Как мне убедить Entity Framework при выборке из Documents создавать именно такой запрос, чтобы свойство Quantity у сущности Document было, а поля в таблице – не было?

Сущности описаны как-то так:

public partial class Document
{
public Guid id {get; private set; }

public virtual ICollection Rows {get; private set;}

...
}

public partial class DocumentRow
{
public Guid id {get; private set;}

public virtual Document Document {get; set;}

public decimal Quantity {get; set;}
...
}
  • Вопрос задан
  • 783 просмотра
Решения вопроса 1
Создать partial класс для сущности Document под именем Document.MyExtensionBlaBla.cs; добавить в него новое свойство TotalQuantity и определить логику его вычисления:

public partial class Document
{
     public decimal TotalQuantity => Rows.Sum(x => x.Quantity)
}


Впоследствии, к этому свойству можно обращаться из инстанса Document. Например, так:

var totalSumByDocument = new dbCtx().Documents.Single(x => x.Id == id)).TotalQuantity;


Где id - входной параметр искомого документа, представляющий собой его уникальный идентификатор.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Был подобный вопрос и у меня, нашел это Computed Columns, работает только с той же таблицей где находится сущность.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы