我有以下视图模型(为简单起见)。
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>()
。
当我(手动)编写以下查询时,一切都像魅力一样。投影后的过滤,排序,分组工作作为加速(例如由gridview使用)。
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,名称 = null 等)。但这对我来说很好,因为结果显示在网格中,我可以轻松处理这个问题。
所以现在当我使用 时Project.To<OrderVM>()
,AutoMapper 生成的 Select 表达式将如下所示:
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
表达式并使用纯嵌套初始化程序。有没有可能,或者有什么解决方法吗?不幸的是,我在玩表情树方面没有那么丰富的经验。