2017-09-27 53 views
0

我有一个包含EF Dbcontext和实体的DAL图层。我有一个服务,其中包含一个方法,我希望从逻辑层执行简单的选择。Func <T, dynamic> to Func <TEntity,dynamic>

层: 逻辑=> DalService => DbContext.DbSet.Select(东西)

DAL不知道任何DTO模式。 逻辑层不知道任何实体。

基本上,我想转换: Func<T, dynamic>选择 到 Func<TEntity, dynamic>选择,我可以基本上在DbSet<TEntity>使用。

感谢

+1

FWIW,我会考虑你的架构是一个反模式的东西,我相信你正在做这个分离的担忧或使单元测试更容易。你的“逻辑”层应该直接访问DbContext,以减少对复杂中间件的需求,比如你正在寻找的东西。如果需要,该层应该将任何结果映射到DTO模型。 –

+1

也许它是'表达式'而不是'Func ''? – ASpirin

+1

看到这个问题的类似要求:https://stackoverflow.com/questions/2797261/mutating-the-expression-tree-of-a-predicate-to-target-another-type –

回答

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(); 
+0

是的,正确的。然而,动态手段我试图: 方法:动态GetMyModelById (长ID,函数功能 F){} 用法:GetMyModelById (1,F =>新的{f.code,f.name}) – MrH40XX

+1

'AutoMapper'映射** data **,它不映射表达式或lambda。 – Maarten

+1

我不是在寻找automapper。我正在寻找动态映射。我想要一个我在逻辑层上定义的匿名对象。我想获得实体,但不是所有的领域。由于我的实体包含很多字段,我只想选择一些字段。我不想制作100个模型和100个不同的方法,只选择不同的领域。 – MrH40XX

相关问题