EF Core 和 Automapper - 过滤子记录

2023-12-03

我想进行一个 EF Core 调用,返回一个父对象以及经过过滤的关联子对象列表,并将其投影到 dto。我想通过 EF Core Linq 查询来执行此操作,我怀疑 ProjectTo 部分忽略了到目前为止的过滤。是否可以?

  • EF 核心 5.0
  • 自动映射器7.0.0

我有另一个查询,它获取父记录并包含所有没有过滤器的子记录,因此如果可能的话,我想在 Dto 映射配置之外实现一些内容。

领域对象

public class ParentThing
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public List<ChildThing> ChildThings { get; set; }
}

public class ChildThing
{
    public Guid Id { get; set; }
    public Guid ParentThingId { get; set; }
    public DateTime Date { get; set; }
    public ParentThing ParentThing { get; set; }
}

Dtos

public class ParentThingDto : IMapFrom<ParentThing>
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public List<ChildThingDto> ChildThings { get; set; }
}

public class ChildThingDto : IMapFrom<ChildThing>
{
    public Guid Id { get; set; }
    public DateTime Date { get; set; }
}

Query

var upUntilDate = new DateTime(2013,1,1);

return await _context.ParentThings
  .Where(x => x.Id == request.ParentThingId)
  .Include(x => x.ChildThings.Where(y => y.Date <= upUntilDate))
  .ProjectTo<ParentThingDto>(_mapper.ConfigurationProvider)
  .FirstOrDefaultAsync();

我得到什么

{
  "id": "a5c8f72a-4682-4f62-b231-4c77c0615b84",
  "name": "Parent thing 9",
  "childThings": [
    {
      "id": "ff5fda07-1c15-411c-b72e-e126b91513b3",
      "date": "2014-06-26T22:41:20.7141034"
    },
    {
      "id": "4dded8a3-2231-442e-b40a-1e114da2665a",
      "date": "2012-04-02T06:51:31.963399"
    }
  ]
}

我期望/想要什么

请注意,我只返回一个孩子的东西,而不是 2 个,这是因为一个孩子在之后有约会2013-01-01这是我想要的过滤点。

{
  "id": "a5c8f72a-4682-4f62-b231-4c77c0615b84",
  "name": "Parent thing 9",
  "childThings": [
    {
      "id": "4dded8a3-2231-442e-b40a-1e114da2665a",
      "date": "2012-04-02T06:51:31.963399"
    }
  ]
}

只是一个注释要说IMapFrom<T>仅执行以下操作

public interface IMapFrom<T>
{   
    void Mapping(Profile profile) => profile.CreateMap(typeof(T), GetType());
}

AFAIK Include当您投影到自定义 dto 投影时,无论是手动通过Select或使用 AutoMapper。

相反,使用自定义配置文件

public class CustomProfile : Profile
    {
        public CustomProfile()
        {
            DateTime? upUntilDate = null;

            CreateMap<ParentThing, ParentThingDto>()
                .ForMember(m => m.ChildThings, opt => 
                    opt.MapFrom(m => m.ChildThings.Where(y => 
                       upUntilDate.HasValue ? y.Date <= upUntilDate : true))
                    );
        }
    }

然后当你投影时添加upUntilDate论据中的ProjectTo

var upUntilDate = new DateTime(2013,1,1);

return await _context.ParentThings
  .Where(x => x.Id == request.ParentThingId)
  .ProjectTo<ParentThingDto>(_mapper.ConfigurationProvider, new { upUntilDate })
  .FirstOrDefaultAsync();

如果您不想过滤子项,只需将 upUntilDate 设置为 null(或不添加参数)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF Core 和 Automapper - 过滤子记录 的相关文章

随机推荐

  • 如何在 Android 内部存储上创建文件?

    我想将内部存储上的文件保存到特定文件夹中 我的代码是 File mediaDir new File media if mediaDir exists mediaDir createNewFile mediaDir mkdir File f
  • 从 DOM 中删除 HTMLCollection 元素

    我有一个段落元素的集合 有些是空的 有些只包含空格 而另一些则有内容 p Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpi
  • 如何构建新的 ASP MVC 应用程序?

    我需要启动一个新的 mvc 项目 并且一如既往地我有关于 ASP 身份的问题 永远不知道把它放在哪里 我计划像这样组织解决方案 ProjectWebUI 具有 asp 身份框架的 mvc 应用程序 由具有身份验证的互联网模板制成 Proje
  • Racket 流会记住它们的元素吗?

    当从无限流中计算大量数字时 Racket 是否使用记忆 因此 举例来说 如果我打印 也称为计算并显示 无限整数流上的前 400 个数字 1 2 3 399 400 就在我要求打印这个无限流上的前 500 个数字之后 第二组计算会使用记忆吗
  • Laravel 迁移更改使列可以为空

    我创建了一个未签名的迁移user id 我怎样才能编辑user id在新的迁移中也能做到这一点nullable Schema create throttle function Blueprint table table gt increme
  • 在iOS应用程序中使用本地视频文件(xcode)

    我正在寻找在 iOS 应用程序中播放视频文件的最佳方式 我的应用程序目前正在开发中 将有大约 50 个视频 每个视频长 30 秒 和简短教程 如果可能的话 我希望它们全部在本地 这样用户就可以在没有互联网连接时观看视频 我在堆栈溢出上找不到
  • 如何使用AspectJ修改返回对象的属性?

    我有一个如下所示的类 来自 Spring Roo DataOnDemand 它返回一个新的瞬态 非持久化 对象以用于单元测试 这就是我们从 Spring Roo 的 ITD 进行推送后的代码 public class MyObjectOnD
  • 错误:java.lang.ClassNotFoundException:更新 android studio 3.0.0 时未找到类 org.openjdk.jdi.ReferenceType

    我已将我的项目从 2 2 3 迁移到稳定的 android studio 3 0 0 并设置 jdk 1 8 现在我们运行该应用程序 我正进入 状态 以下例外 Error java lang ClassNotFoundException C
  • jquery .each() .load() 等待完成

    我正在使用 jquery 将行加载到表中 我想知道如何使它们一一加载 即 只有在第一个块完成加载后 第二个块才应开始加载 我的桌子看起来有点像这样 table thead tr th Heading th tr thead tbody tb
  • 无法在 Xcode 6.1 中存档正在运行的 6.0.1 Swift 项目/分段错误:11

    由于信号导致命令失败 分段错误 11 在 Users thedude Documents Repositories MyProject Data swift 258 36 line 258 56 RangeText UILocalNotif
  • 调试 winform 崩溃 - C# [ADPlus + Windbg]

    System AccessViolationException was unhandled Message Attempted to read or write protected memory This is often an indic
  • 无法从 MSR 读回

    我正在编写一个内核模块 它是关于读写 MSR 的 我写了一个简单的程序进行测试 但仍然失败 它所做的就是写入 MSR 然后读回 这是代码 static int init test3 init void uint32 t hi lo hi 0
  • 从另一个类中的 JPanel 文本字段获取值

    I have JPanel使用文本框 在另一个面板中保存按钮 如果我点击保存按钮 我必须获取第一个面板文本框值 如何访问它 只需将 TextField 设置为公共静态数据即可 然后你可以使用 ClassName TextFiledName
  • .net FlagsAttribute 枚举是否需要手动赋值?

    为了允许在显示新闻故事的方法上使用不同的格式选项 我创建了一个可以传入的枚举来指定它的显示方式 Flags private enum NewsStyle Thumbnail 0 Date 1 Text 2 Link 4 All 8 stri
  • 从虚拟变量中最简单地创建因子变量

    此处问题的选定答案 使用 dplyr 创建因子变量 没有给哈德利留下深刻的印象 后续的答案并不能很好地概括我遇到的一些问题 我想知道社区是否可以通过一个更简单的示例做得更好 DATA A round runif 200 0 1 0 B c
  • SSIS:更新或插入后删除行

    这是以下情况 我有一张桌子学生需要与不同服务器上的另一个表同步 学生B 这是从 A 到 B 的单向同步 由于表 StudentsA 可以容纳大量行 因此我们有一个名为学生同步 在输入服务器上 包含 ID学生自上次复制以来已被修改学生 to
  • 可组合性在流量收集后不断重组

    我的可组合项在流量收集并导航到新屏幕后不断地重新组合 我不明白为什么 我正在使用 Firebase 通过电子邮件和密码进行身份验证 我不得不放一些Log i测试我的函数和可组合项 是的 我的主要可组合项 SignUp 在导航后不断地重新组合
  • 泛型中 T 等于 T 是什么意思

    我正在研究苹果的新语言swift 我查看了Swift模块 并看到一些通用类有以下声明 extension ContiguousArray
  • 如何从war文件之外的路径读取Logback配置文件?

    我有一个要求 我想将所有 logback 配置放在 war 文件之外 目前 我已将配置文件 logback xml 放在类路径上 我正在使用 JBOSS EAP Web 应用程序服务器 请建议如何实现相同的目标 进入 jboss 启动 运行
  • EF Core 和 Automapper - 过滤子记录

    我想进行一个 EF Core 调用 返回一个父对象以及经过过滤的关联子对象列表 并将其投影到 dto 我想通过 EF Core Linq 查询来执行此操作 我怀疑 ProjectTo 部分忽略了到目前为止的过滤 是否可以 EF 核心 5 0