我有一个相当长而讨厌的查询,用于映射复合数据。
项目设置是将 AutoMapper 配置保存在 ViewModels 中。由于我的查询很长,并且涉及很多业务逻辑,并且有可能被重用,因此我很想将其提取到服务中。
知道ProjectTo
支持object parameters
作为第二个参数,我在服务中创建了一个 Expression属性,如下所示:
Expression<Func<User, IQueryable<string>>> Filter { get; }
并将其作为参数传递给AutoMapper:
this.DataRepository.All().ProjectTo<ViewModel>(
ConfigurationProvider,
new { filter = service.Filter })
ConfigurationProvider
是标准的 AutoMapper 提供程序,而service
是-我的服务。
映射方法如下:
Expression<Func<User, IQueryable<string>>> filter = null;
configuration.CreateMap<User, ViewModel>()
.ForMember(
m => m.MyProperty,
opt => opt.MapFrom(filter));
这是教科书示例,如AutoMapper docs
中提供这种确切的方法在我传递IQueryable<Entities>
之前就起作用了,但是,如果我尝试传递 Expression ,filter
变量只会保留null
。显然,这会导致映射后为空值。
为什么 AutoMapper 无法解析表达式?