Используйте проекцию, чтобы заполнить не отображенные типы в EF - PullRequest
1 голос
/ 02 апреля 2012

У нас есть специальная структура, которая называется Measure, и мы хотели бы использовать этот тип вместо типа поля базы данных, например, двойной.

Итак, у нас есть сущность:

public class MyEnity
{
   public int MyValue { get; set; }
}

И у нас есть трансферный объект: публичный класс MyDto { public Measure MyMeasureValue {get; задавать; } }

Если тип свойства будет соответствовать, мы можем просто заполнить наши dto на проекцию:

enities.Select(i => new MyDto { MyMeasureValue = new Measure(i.MyValue, _unitsService.GetUnit("km")) });

Но так как EF не поддерживает такие операторы, мы должны заполнить это или загрузить всю сущность:

entities.Select(i => new { MyValue = i.MyValue })
        .AsEnumerable()
        .Select(i => new MyDto { MyMeasureValue = new Measure(i.MyValue, _unitsService.GetUnit("km")) } );

Мы хотим избежать этого зацикливания несколько раз в процессе пополнения, особенно потому что есть много свойств, которые нужно заполнить. Есть ли способ, которым мы можем пойти с первым утверждением и научить EF выполнять создание Меры? (например, перехват и т. д.)

PS. Невозможно создать сложный тип EF и отобразить его!

Спасибо, Enyra

1 Ответ

0 голосов
/ 02 апреля 2012

Вы можете использовать сложные типы при извлечении некоторых свойств объекта с помощью Linq-Entity. Например;

Model1Container container = new Model1Container();
var temp = from o in container.MasterSet
           select new
                  {
                       x = o.LastModifiedBy,
                       y = o.LastModifiedDate
                  };

Кстати, вместо ручного отображения DTOS лучше использовать autommaper. Он имеет функциональность для сопоставления подходящих имен без объявления экспликации.

...