C# 在使用AutoMapper';有嵌套对象的项目?

C# 在使用AutoMapper';有嵌套对象的项目?,c#,linq,automapper,iqueryable,xpo,C#,Linq,Automapper,Iqueryable,Xpo,我有以下viewmodels(为了简单起见的示例) 我使用嵌套的viewmodel来避免重复我自己(我的实际代码要复杂得多),所以我希望避免需要一直扁平化产品 我使用DevExpress XPO作为ORM,它很好地支持选择嵌套视图模型。但是,我对Project().To()生成的Select表达式有一个问题 当我(手动)编写以下查询时,一切都像一个符咒。投影后的过滤、排序和分组按expedted进行(例如由gridview使用) var q=myUnitOfWork.Query()。选择(e=>

我有以下viewmodels(为了简单起见的示例)

我使用嵌套的viewmodel来避免重复我自己(我的实际代码要复杂得多),所以我希望避免需要一直扁平化产品

我使用DevExpress XPO作为ORM,它很好地支持选择嵌套视图模型。但是,我对
Project().To()
生成的Select表达式有一个问题

当我(手动)编写以下查询时,一切都像一个符咒。投影后的过滤、排序和分组按expedted进行(例如由gridview使用)

var q=myUnitOfWork.Query()。选择(e=>
newordervm(){
OrderDate=e.OrderDate,
价格=e.价格,
Product=newproductvm(){
ID=e.Product.ID,
Name=e.Product.Name,
}
});
它的一个副作用是,如果(比方说)订单没有产品,那么viewmodel中的产品将不会为null,而是所有内容都为空(ID=0,Name=null,等等)。但这对我来说很好,因为结果显示在一个网格中,我可以轻松地处理这个问题

现在,当我使用
项目.To()
时,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
           });
var q=myUnitOfWork.Query()。选择(e=>
newordervm(){
OrderDate=e.OrderDate,
价格=e.价格,
Product=e.Product!=null?新ProductVM(){
ID=e.Product.ID,
Name=e.Product.Name,
}:null
});

这当然是一种语义上更正确的方法,但是,XPO将在过滤、排序等方面崩溃。因此,我需要以某种方式避免这个
IIF
表达式,并使用纯嵌套初始值设定项。这是可能的,还是有解决办法?不幸的是,我在处理表达式树方面没有太多经验。

如果我不执行IIF,那么在执行外部联接的映射时,您将得到一个空引用异常。你只能进行内部连接。这可以接受吗?@JimmyBogard是的,你是对的,我的场景很特别,因为XPO的实现。正如我在文章中所写的,如果订单的产品为null,那么XPO不会抛出NullReferenceException,而是为OrderVM的产品成员创建一个“空”的ProductVM。事实上,我发现可以通过AllowNullDestination(或其他)配置来微调AutoMapper的这种行为,因此我将创建一个自定义引擎,并在Project()中使用它来完成此特定任务。
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,
               }
           });
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
           });