我想使用 LinqKit 扩展并调用表达式来映射 AutoMapper 配置中的值。
我有一些业务逻辑,表示为Expression<Func<>>
,使用 LinqKit 可以很好地在各种查询中重用代码。但是,我仍然有相同的逻辑,在类似 DTO 的对象的映射中重复,然后将其发送到客户端应用程序进行渲染。我想通过在我的 AutoMapper 配置方法中使用相同的方法来消除重复。
服务
// Business logic query
private readonly Expression<Func<Entity, bool>> isActive = e => e.IsActive;
// Getter
public Expression<Func<TestParticipation, bool>> IsActive => this.isActive;
LinqKit支持的查询
public IQueryable<Entity> GetAllActive() =>
this.entities
.All()
.AsExpandable()
.Where(e => this.isActive.Invoke(e));
AutoMapper配置
configuration.CreateMap<Entity, DTO>()
.ForMember(m => m.IsActive, opt => opt.MapFrom(e => service.IsActive.Invoke(e));
当然,实际的业务逻辑要复杂得多,因此重用它而不是将其保留在多个位置会更加有益。
我认为这应该可行,因为在查询中调用了AsExpandable
,但是我还没有深入了解 AutoMapper 的工作方式。
当前它抛出:
System.InvalidCastException:
Unable to cast object of type 'System.Linq.Expressions.PropertyExpression' to type 'System.Linq.Expressions.LambdaExpression'.
这是否可能?如果可以,怎么办?