我有一个包含EF Dbcontext和实体的DAL图层。我有一个服务,其中包含一个方法,我想做一个来自逻辑层的简单选择。
层: 逻辑=> DalService => DbContext.DbSet.Select(东西)
DAL不了解任何DTO型号。 逻辑层不知道任何实体。
我基本上试图转换:
Func<T, dynamic>
选择器
至
Func<TEntity, dynamic>
选择器,我基本上可以在DbSet<TEntity>
上使用。
由于
答案 0 :(得分:2)
AutoMapper有一个名为Expression Translation的功能,可以完成从逻辑层查询到DAL查询的转换工作。
首先,您需要设置从TEntity
(您的DAL中的实体类型)到T
(您的逻辑层中的DTO)的映射:
Mapper.Initialize(cfg => cfg.CreateMap<TEntity, T>());
然后,当您的DAL从逻辑层获得一个查询表达式时,如下例所示:
Expression<Func<DTO, dynamic>> logicExpression = (dto) => new { dto.SomeProperty };
它可以像这样翻译:
var dalExpression = Mapper.Map<Expression<Func<TEntity, dynamic>>>(logicExpression);
最后根据您的EF上下文调用:
var results = context.SomeSet.Select(dalExpression).ToList();