【问题标题】:Func<T, dynamic> to Func<TEntity, dynamic> [duplicate]Func<T, dynamic> 到 Func<TEntity, dynamic> [重复]
【发布时间】:2017-09-27 10:28:17
【问题描述】:

我有一个包含 EF Dbcontext 和实体的 DAL 层。我有一个服务,其中包含一个方法,我想做一个来自逻辑层的简单 Select。

层: Logic=>DalService=>DbContext.DbSet.Select(something)

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

我基本上是在尝试转换: Func&lt;T, dynamic&gt; 选择器 到 Func&lt;TEntity, dynamic&gt; 选择器,我基本上可以在 DbSet&lt;TEntity&gt; 上使用。

谢谢

【问题讨论】:

  • FWIW,我认为您的架构是一种反模式,我认为您这样做是为了分离关注点或简化单元测试。您的“逻辑”层应直接访问 DbContext,以减少对复杂中间件的需求,例如您正在寻找的。如有必要,该层应将任何结果映射到 DTO 模型。
  • 可能是Expression&lt;Func&lt;T, dynamic&gt;&gt; 而不是Func&lt;T, dynamic&gt;
  • 查看此问题以了解类似要求:stackoverflow.com/questions/2797261/…
  • 是的;表达式> 到表达式>

标签: c# entity-framework expression func


【解决方案1】:

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

【讨论】:

  • AutoMapper 映射 data,它不映射表达式或 lambda。
  • 我不是在寻找自动映射器。我正在寻找动态映射。我想要一个在逻辑层上定义的匿名对象。我想获取实体但不是所有字段。由于我的实体包含很多字段,我只想选择一些。我不想制作 100 个模型和 100 种不同的方法,而只有选定的字段不同。
  • @Maarten 实际上确实如此 - Expression Translation
  • 也许 AutoMapper 的 Expression Translation 可以解决问题? github.com/AutoMapper/AutoMapper/wiki/…?我看到@ivan-stoev 在我之前发现了这个,所以我把它留给他来提升一个完整的答案:)
  • @urig 谢谢,但我不打算这样做。请随时更新您的答案,我很乐意投票:)
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多