我正在使用存储库模式,所以我的存储库只知道DTO。它必须使用Entity Framework使用某些过滤器查询数据库。 我的问题是,Entity Framework仅了解数据库模型类,因此在能够在任何查询中使用它们之前,我必须“自动映射” 表达式。
我已经声明了一个接受 Expression 作为过滤器的方法。
public interface IRepository
{
IEnumerable<ItemDTO> GetItemsWithFilter(Expression<Func<ItemDTO, bool>> filter)
{
var filterDb = Mapper.Map<Expression<Func<ItemDB, bool>>>(filter);
return dbContext.CONFIGURATIONS.Where(filterDb).Select(x => Mapper.Map<ItemDTO>(x));
}
}
public class ItemDTO
{
public int numero { get; set; }
public string name { get; set; }
}
public class ItemDB //they are both the same, just for testing purpose
{
public int numero { get; set; }
public string name { get; set; }
}
//failing code
Repository.GetItemsWithFilter(x => x.name=="a");
我遵循tutorial的说法,说可以在表达式之间进行映射,但出现一些错误:
“ LINQ to Entities不支持指定的类型成员'name'。仅支持初始化程序,实体成员和实体导航属性。”}
答案 0 :(得分:3)
我通过包含以下扩展方法调用来解决了该问题:
Mapper.Initialize(cfg => {
cfg.AddExpressionMapping();
// Rest of your configuration
});
请记住安装nuget软件包 AutoMapper.Extensions.ExpressionMapping
Install-Package AutoMapper.Extensions.ExpressionMapping