AutoMapper:如何在Linq表达式之间映射(Func <>)

时间:2018-07-10 12:25:52

标签: entity-framework expression automapper

我正在使用存储库模式,所以我的存储库只知道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'。仅支持初始化程序,实体成员和实体导航属性。”}

1 个答案:

答案 0 :(得分:3)

我通过包含以下扩展方法调用来解决了该问题:

 Mapper.Initialize(cfg => {
    cfg.AddExpressionMapping();
    // Rest of your configuration
 });

请记住安装nuget软件包 AutoMapper.Extensions.ExpressionMapping

Install-Package AutoMapper.Extensions.ExpressionMapping