AutoMapper:无法将类型为“System.Linq.Expressions.MethodCallExpressi

本文关键字:System Linq Expressions MethodCallExpressi 类型 AutoMapper | 更新日期: 2023-09-27 17:55:27

从我从这个错误中读到的内容来看,在这里:为什么有些对象属性是 UnaryExpression,而另一些是 MemberExpression?

当需要对象但返回值类型时,会发生这种情况,因此 CLR 必须打包此对象,这是另一个(一元)表达式。

真正困扰我的是,以下自动映射器映射可以正常工作:

.ForMember(d => d.IndividualId, c => c.MapFrom(f => f.Individual.Id));

只有当映射表达式具有另一个返回值类型的表达式时,它才不起作用:

.ForMember(d =>
    d.IndividualId, c => c.MapFrom(f =>
        f.Individuals.First(d => d.Individual.Name == "Test").Id
    ));

我写这个例子只是为了展示我想做什么,所以它可能不是 100% 合适的?我只是不能落后,为什么第一个表达式不会导致此异常,因为在这两种情况下都必须进行打包?

编辑

Itvan的答案也有效,目标只是消除对包装的需求。这也适用于这样的东西:

m => m.MapFrom(f =>
    f.Individuals.Where(ms => ms.Individual.Name == name)
    .Select(i => i.Individual.Id).FirstOrDefault()
)

AutoMapper:无法将类型为“System.Linq.Expressions.MethodCallExpressi

我刚刚遇到了相同的异常,它可能是自动映射器中的一个错误,我不确定,但我在下班后有一个解决方法。这是我所拥有的:

class MyDto
{
    public int? StatusId;
    public int? OtherStatusId;
}
class MyModel
{
    public int StatusId; 
}
// this should work normally
.ForMember(d => d.StatusId, c => c.MapFrom(f => f.Order.StatusId));
// this causes the exception above, but I don't know why, 
// maybe because I have some quite complex mapping
.ForMember(d => d.OtherStatusId, c => c.MapFrom(f => f.Other.StatusId));
// apply a cast on the source expression make the mapping smoothly
.ForMember(d => d.OtherStatusId, c => c.MapFrom(f => (int?)f.Other.StatusId));

我认为某些版本的AutoMapper有这个问题。我不确定这是否仍然发生在最新版本上???

但主要问题是无法解决的可为空表达式。自动映射器返回一个简单的值(如:c => c.Id)比解析像 c => c.Data.Path2.Data.Path2.Where(..).Id 这样的可为空表达式更容易。解决此问题的一种方法是检查空(旧方法)...表达式树 lambda 不能包含空传播运算符

顺便说一下,如果您尝试对数据库实体使用自动映射器,则此代码很糟糕。我建议使用 ProjectTo 并发送一个带有 IndividualId 列表的参数。更多信息: http://docs.automapper.org/en/stable/Queryable-Extensions.html