过滤 thenInclude 三个嵌套级别

2023-12-05

我试图向下过滤三个子级别并仅查找 Property Mailing Address.Status== True 的子元素。

它仍然返回 PropertyMailingAddress.Status 下为 False 的值

如何将过滤器向下转换三级并使用 thenIninclude 进行嵌套过滤?

类结构嵌套如下:

  1. Property
  2. 财产党
  3. Party
  4. 当事人邮寄地址
  5. 物业邮寄地址
var result = await propertyRepository.GetAll()
                .Include(pm => pm.PropertyParty).ThenInclude(x => x.Party).ThenInclude(x => x.PartyMailingAddress).ThenInclude(x => x.PropertyMailingAddress)
                .Where (a=> a.PropertyParty.Any(x=> (x.Party.PartyMailingAddress.Any(z => z.PropertyMailingAddress.Any(h => h.Status.HasValue && h.Status.Value && h.Status == true))))

人们倾向于使用“包含”作为某种选择的快捷方式。但是,包含所有属性通常会浪费处理能力,因为您不会使用其中的几个属性或者因为您已经知道其值。

以学校与学生为例,这是一种简单的一对多关系。每个学校都有零个或多个学生,每个学生都就读于一所学校,即外键 SchoolId 所指的学校。

因此,如果学校 [10] 有 2000 名学生,则每个学生的 SchoolId 值都等于 10。如果您查询学校 [10] 及其学生,则将传输此值 [10] 超过 2000 次。多么浪费处理能力啊!

在实体框架中,使用Select查询数据,并且仅选择您实际计划使用的值。仅使用Include如果您打算更新包含的数据。

当然不要使用“包含”作为“选择所有属性”的某种快捷方式!

回到你的问题

  • 每个 Property 都有零个或多个 PropertyParties。
  • 每个 PropertyParty 都有零个或多个 Properties。
  • 每个属性都有零个或多个 PartyMailingAddresses
  • 每个 PartyMailingAddress 都有零个或多个 PropertyMailingAddress
  • 每个 PropertyMailingAddress 都有一个布尔属性 Status

您想要查询所有属性(的多个属性),这些属性的内部至少有一个具有真实状态值的 PropertyMailingAddress。

每当您有一系列 Items,其中每个 Item 都有 OtherItems 的子序列,并且您想要调查所有 OtherItems,就好像它是一个序列一样,请考虑使用 SelectMany:

var propertiesWithTrueStatus = propertyRepository.GetAll()
    .Where(property => property.SelectMany(property => property.PropertyParties)

        // result: one big sequence of all PropertyParties of all properties
        .SelectMany(propertyParty => propertyParty.PartyMailingAddresses)

        // result: one big sequence of all PartyMailingAddresses of all 
        // PropertyParties of all Properties
        .SelectMany(partyMailingAddress => partyMailingAddress.PropertyMailingAddresses)
        .Select(propertyMailingAddress => propertyMailingAddress.Status)

        // result: one big sequence of all Statusses of all PropertyMailingAddresses
        // of all ... of all Properties

        // Keep only the true status values:
        .Where(status => status)

        // keep only the Properties that have at least one true Status value
        .Any())
        // end of Where(...)

因此,现在您只有那些在内部深处至少具有一个真实状态值的属性。继续查询Select(或者如果你真的想要:Include)

    .Select(property => new
    {
        // Select only the properties that you actually plan to use
        Id = property.Id,
        Name = property.Name,
        ...

        PropertyParties = property.PropertyParties.Select(propertyParty => new
        {
            // again only the properties that you plan to use:
            Id = propertyParty.Id,
            ...

            // no need to Select this, you already know the value
            // PropertyId = propertyParty.PropertyId

            PartyMailingAddresses = propertyParty.PartyMailingAddresses
                .Select( partyMailingAddress => new { ... } )
                .ToList(),
        })
        .ToList(),
    });

除此之外,Select 比 Include 更高效,如果需要,它还可以让您更自由地偏离数据库表。如果您不需要最终结果中的所有 PropertyMailingAddresses,则只需不要选择它们即可。如果您只需要 PropertyParties 的总数,请使用PropertyPartyCount = propertyParties.Count。使用 Select,返回的数据不必与数据库表相似。

这样做的优点是您可以隐藏数据库中的更改:只需更改选择,所有用户都不会注意到您在内部深处更改了表。

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

过滤 thenInclude 三个嵌套级别 的相关文章

随机推荐

  • 迭代目录中的所有文件并查找和替换文本 - Python

    宝贝全新 这是弗兰肯斯坦从几个类似的主题组合在一起的 其中没有一个似乎涵盖了在文件循环中嵌套查找和替换的必要步骤 我试图迭代特定类型 此处列为 LIC 的文件夹中的每个文件 不是递归 我只有一个文件夹级别 并替换一小段文本 以下是我所能得出
  • MSBuild XmlMassUpdate 任务

    我想问一个有关 MSBuild 任务 XmlMassUpdate 行为的简单问题 有没有人发现该任务只会将唯一节点复制到内容 XML 中 例如 如果我有一个客户端节点 它有多个称为端点的子节点 那么它只会批量复制第一个端点节点 同时消除所有
  • 如何使用spring全局配置jackson?

    为了序列化反序列化对象 我使用 Jackson 作为流程 JsonSerialize using LocalDateSerializer class JsonDeserialize using LocalDateDeserializer c
  • 如何在本机反应中隐藏特定屏幕上的底部导航栏?

    我正在使用 React Native 和 React Native Navigation 来构建我的应用程序 目前 我有三个底部选项卡 主页 上传视频和消息 选择 上传视频 选项卡后 我想渲染 上传视频 组件并隐藏该屏幕上的底部选项卡 并显
  • 从 JDBC 创建 Spark 数据帧时如何指定 sql 方言?

    我在使用 Spark 通过自定义 JDBC 读取数据时遇到问题 我将如何覆盖通过 jdbc url 推断的 sql 方言 有问题的数据库是 vitess https github com youtube vitess 它运行一个 mysql
  • 在 asp.net 中显示“保存文件”对话框

    这是在 asp net 中 我正在参考用户的输入创建 pdf 文件 该 pdf 文件保存在服务器上的文件夹中 现在可以使用response redirect 在浏览器中显示该文件 但我想向用户显示 保存文件 对话框 就像我们从网站下载 ex
  • 选择 CSS 中的特定元素

    抱歉 帖子标题非常笼统 但我在这里追求的是 div span a href link 1 a a href link 2 a span a href link 3 a div 我如何在 CSS 中选择 链接 3 无需编辑该 Htmlat a
  • Firebase 身份验证和 Google 日历

    我想做的是使用 Firebase 向 Google 进行身份验证 然后从 Google 日历获取一些数据 我让第一部分工作了 我可以通过 Google 进行身份验证并获取用户名 电子邮件等 但是一旦添加calendar to the sco
  • Button.PerformClick 的作用是什么?

    我知道这可能是一个微不足道的问题 但我只是想知道调用是否有任何优势Button PerformClick而不是直接调用按钮的点击事件 MSDN 文档简单地说 为按钮生成 Click 事件 这是否意味着它只是与调用按钮的单击事件执行相同的操作
  • 绘图中的保留热图

    为了方便起见 我将保留图从 Seaborn 转移到 Plotly 以便稍后对其应用形状 plotly库似乎适合this graph objects 但我不明白如何传递DataFrame数据 import pandas as pd impor
  • 访问连续表:添加控件而不修改基础表?

    我正在制作一个简单的访问表单 连续视图 详细信息部分中有一个复选框 页脚中有一个命令按钮 这样 用户可以使用复选框 选择 多个记录 然后单击按钮上的命令按钮来运行更新所选记录的脚本 无需永久存储这些检查值 通常 我会向基础表添加一个布尔字段
  • 更改文本区域中特定部分的文本颜色

    是否有可能更改 HTML 文本区域中某些部分的文本颜色 我喜欢在我的网站上输出一些突出显示的 PHP 代码 并可以通过单击此文本区域来选择完整的代码 我已经编写了一个 JavaScript 函数来选择完整的文本 但如果我尝试在文本周围放置跨
  • 将图钉放在屏幕中央,MKMapView

    我有一个使用以下代码删除 pin 的功能 ParkPlaceMark placemark ParkPlaceMark alloc initWithCoordinate location mapView addAnnotation place
  • 第二次单击时 redux 状态值发生变化

    我是 redux 的新手 我已将其与我的 React 应用程序集成 但我有一个关于小测试的说明 在下一个示例中 我看到用户的值在我的第二次单击时添加了 减速机 const initialState user password export
  • 计算表行数

    检索表中记录数的 MySQL 命令是什么 SELECT COUNT FROM fooTable 将计算表中的行数 See the 参考手册
  • getJSON 调用中的错误处理

    如何处理 getJSON 调用中的错误 我尝试使用 jsonp 引用跨域脚本服务 如何注册错误方法 getJSON 是常规 AJAX 调用的一种抽象 您必须在其中告诉您需要 JSON 编码的响应 ajax url url dataType
  • Ionic - 按下按钮后显示微调器

    This spinnerionic 的选项一直在旋转像这儿
  • JdbcTemplate - 使用 SQL MERGE 插入或更新 Oracle BLOB

    使用 JdbcTemplate 我想调用 MERGE SQL 语句 该语句将向表中插入新记录 或者如果具有特定键的行已存在则进行更新 关键部分是其中一列是 Oracle BLOB 类型 这是我到目前为止所尝试的 Try 1 sql语句 St
  • Java - 使用 Apache Commons 数学库计算导数

    我在使用 apache commons 数学库时遇到问题 我只想创建像 f x 4x 2 2x 这样的函数 并且我想计算这个函数的导数 gt f x 8x 2 我读过关于差异化的文章 http commons apache org prop
  • 过滤 thenInclude 三个嵌套级别

    我试图向下过滤三个子级别并仅查找 Property Mailing Address Status True 的子元素 它仍然返回 PropertyMailingAddress Status 下为 False 的值 如何将过滤器向下转换三级并