【问题标题】:Using AutoMapper and Entity Framework to change what columns are fetched from a database table使用 AutoMapper 和 Entity Framework 更改从数据库表中获取的列
【发布时间】:2019-11-24 18:21:28
【问题描述】:

我们有一个新要求,我们需要从表中动态获取列列表。我们在这个表中有 141 列,但假设我们只想返回其中的 2 或 3 个,我们只是在运行时才知道哪 3 个。

这些列作为List<string> 传入,希望我可以使用反射来访问源对象上的属性。

我们已经通过能够将TObjectDto 传递到我们的服务中来支持这一点,我们的IQueryable 在访问数据库之前被投射到该服务中,它只是不处理等式中的动态列部分。

到目前为止,我无法使用 MapFrom 做类似的事情(运气不好,因为 LINQ 不支持反射,它必须是 LINQ,否则查询不支持)

http://docs.automapper.org/en/stable/Queryable-Extensions.html#supported-mapping-options

有什么理由我应该继续从这个兔子洞中走下去,而只使用我必须生成的一些原始 SQL 吗?

【问题讨论】:

  • 在我看来你的数据库设计对于这个应用程序是错误的
  • 我不反对,这在某种程度上是我们应用程序的核心,并且非常庞大(在列和数据中)
  • 您需要 80~ 个不同的查询,您需要通过一个字符串(列名或最好的名称)进行选择。像 Dictionary>>> 之类的东西怎么样?

标签: c# entity-framework-6 automapper iqueryable automapper-8


【解决方案1】:

我找到了一个我非常满意的解决方案

我声明了一个直接从我的模型类继承的 Dto 类

    public class MyObjectDto : MyObject
    {
    }

然后像这样配置一个 AutoMapper 配置文件

CreateMap<MyObject, MyObjectDto>()
            .ForAllMembers(s => s.ExplicitExpansion());

然后我整理了我想要检索的字段列表并

                result = await myObjects
                    .ProjectTo<TMyObjectDto>(_mapperConfiguration, null, fieldsToRetrieve.ToArray())
                    .ToListAsync().ConfigureAwait(false);

然后只查询fieldsToRetrieve 中属性的数据库值,并将其余的保留为空/默认值,非常适合我的需要

感谢 Lucian 在 cmets 中为我指明了正确的方向

【讨论】:

    猜你喜欢
    • 2017-01-23
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多