Можно ли избежать выражения IIF при использовании проекта AutoMapper с вложенным объектом?

У меня есть следующие viewmodels (пример для простоты).

public class ProductVM {
   public int ID { get; set; }
   public string Name { get; set; }
}

public class OrderVM {
   public ProductVM Product { get; set; }
   public double Price { get; set; }
   public DateTime OrderDate { get; set; }
}

Я использую вложенную модель представления, чтобы избежать повторения (мой реальный код намного сложнее), поэтому я бы хотел избежать необходимости постоянно выравнивать Продукт.

Я использую DevExpress XPO в качестве ORM, который хорошо поддерживает выбор вложенных моделей просмотра. Однако у меня есть проблема с выражением Select, созданным Project().To<OrderVM>(),

Когда я (вручную) пишу следующий запрос, все работает как шарм. Фильтрация, сортировка, группировка ПОСЛЕ проекции работает в ускоренном режиме (используется, например, в виде сетки).

var q = myUnitOfWork.Query<Order>().Select(e => 
           new OrderVM() {
               OrderDate = e.OrderDate,
               Price = e.Price,
               Product = new ProductVM() {
                   ID = e.Product.ID,
                   Name = e.Product.Name,
               }
           });

Одним из побочных эффектов является то, что если - скажем, - у Заказа нет Продукта, то Продукт в модели представления не будет нулевым, но будет иметь все пустое (ID = 0, Name = null и т. Д.). Но это хорошо для меня, потому что результат отображается в виде сетки, где я могу с этим справиться.

Так что теперь, когда я использую Project.To<OrderVM>()выражение Select, сгенерированное AutoMapper, будет выглядеть так:

var q = myUnitOfWork.Query<Order>().Select(e => 
           new OrderVM() {
               OrderDate = e.OrderDate,
               Price = e.Price,
               Product = e.Product != null ? new ProductVM() {
                   ID = e.Product.ID,
                   Name = e.Product.Name,
               } : null
           });

Это, конечно, семантически более правильный подход, однако XPO будет зависать при фильтрации, сортировке и т. Д. Поэтому мне как-то нужно избегать этого IIF выражение и остаться с чистым вложенным инициализатором. Это как-то возможно, или есть обходной путь? К сожалению, я не настолько опытен в игре с деревьями выражений.

0 ответов

Другие вопросы по тегам