使用 LINQ 查询和创建具有一对多关系的对象

2024-04-09

在数据库中,我有两个具有一对多关系的表:

orders          suborders
-----------     -----------
id              id
name            order_id
                name

我想查询这些表并最终得到一个订单对象列表,每个对象都包含一个子订单对象列表(或空列表)。我还想在单个数据库查询中执行此操作,以便它表现良好。

在传统的 SQL 查询领域,我会做类似的事情(原谅伪代码):

rs = "select o.id, o.name, so.id, so.name from orders o left join suborders so on o.id = so.order_id order by o.id"

orders = new List<Order>
order = null
foreach (row in rs) {
    if (order == null || row.get(o.id) != order.id) {
        order = new Order(row.get(o.id), row.get(o.name), new List<Suborders>)   
        orders.add(order)
    }    

    if (row.get(so.id) != null) {
        order.suborders.add(new Suborder(row.get(so.id) row.get(so.name))
    }
}

有没有办法使用 LINQ-to-Entities 获得相同的结果对象结构?请注意,我想从查询中获取新对象,而不是实体框架生成的对象。

以下内容让我接近,但引发异常:“LINQ to Entities 无法识别该方法...”

var orders = 
    (from o in Context.orders
     join so in Context.suborders on o.id equals so.order_id into gj
     select new Order 
     {
         id = o.id,
         name = o.name,
         suborders = (from so in gj select new Suborder
         {
             so.id,
             so.name
         }).ToList()
     }).ToList();

解决方案最终非常简单。关键是使用组联接让 SQL 对子订单执行左联接,并添加第二个 ToList() 调用以强制运行查询,这样您就不会尝试在 SQL 服务器上创建对象。

orders = Context.orders
    .GroupJoin(
        Context.suborders,
        o => o.id,
        so => so.order_id,
        (o, so) => new { order = o, suborders = so })
    .ToList()
    .Select(r => new Order
    {
        id = r.order.id,
        name = r.order.name,
        suborders = r.suborders.Select(so => new Suborder
        {
            id = so.id,
            name = so.name
        }.ToList()
    }).ToList();

此代码仅对所有对象及其子对象进行一次 SQL 查询。它还允许您将 EF 对象转换为您需要的任何对象。

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

使用 LINQ 查询和创建具有一对多关系的对象 的相关文章

随机推荐

  • Clojure 和 scala 互操作

    我熟悉 scala 类 对象可以从 clojure 调用 因为 scala 编译为字节码 并且 clojure 对此很满意 然而 调用 clojure 函数和从 scala 导入命名空间是否一样轻松 我想将优秀的 lift 框架和 cloj
  • Visual Studio 扩展来执行 SQL

    我的 Visual Studio 2010 项目中有几个 sql 文件 我正在寻找一个扩展或添加 我可以右键单击 sql 文件并针对 sql server 数据库执行其内容 有人知道这样的扩展是否存在吗 从 SQL Server Denal
  • 如何将 p 值注释到 R 上的分面条形图上?

    我想知道是否可以在图表顶部和两个条形图之间注释 p 值 就我而言 使用 ggplot2 我有一个具有 2 个条件 传代和分离 的多面图 并且在每个条件下 有 3 个级别 3 个条形图 GA CH KO 如果可能的话 我有一些来自成对比较的
  • 扩展图块尾随图标会更新与一个图块交互时列表中的所有内容。如何只更改展开磁贴的图标?

    如何才能使图标仅针对单击的图块进行更新 现在的行为是all单击一个图块时图标会更新 这是代码 修剪为仅包含相关部分 Column children List generate filteredFAQ length index gt Colu
  • Gson POJO 映射丢失自定义字段值

    我正在尝试使用 Gson 将 JSON 映射到 POJO 其中 POJO 包含不属于 JSON 的自定义字段 当调用其他字段的 setter 将要更新的字段的名称添加到列表时 该字段就会更新 POJO 类看起来像这样 public clas
  • 为 postgresql 全文搜索添加新语言

    有没有办法向 postgresql 全文搜索添加新语言 我可以从哪里阅读或从哪里开始 你可以看看这个a link http www postgresql org docs 9 4 static textsearch dictionaries
  • 尝试使用 INET 引用创建新项目,在 .msg 文件中得到:“unexpected NAME, waiting $end”

    我创建了一个项目 其中包含我的链路层和模拟源代码 该项目以 INET 作为项目参考 在构建时 我收到此错误 错误 语法错误 意外的名称 期望 end 它来自消息文件 包含消息类型 import inet common INETDefs 我的
  • Silverlight - 史诗般的图形失败(由两个三角形组成的矩形):(

    我想用两个三角形绘制矩形 非常简单的任务 但Silverlight无法处理它
  • 多个函数的指针

    是否可以保证仅名称不同的函数 也不是参数和返回类型 不能共享 C 和 C 中的相同地址 我在标准中没有看到任何相关内容 include
  • 如何开发具有登录功能的基于 TabBar 的应用程序?

    我正在开发一个应用程序 我需要向用户显示一个列表作为菜单 课程 课程 成绩 注销 所以在此之前我需要显示一个登录屏幕 仅在成功且有效的登录后 我才需要将用户重定向到菜单 所以我计划开发一个基于 tabBar 的应用程序 有 4 个选项卡 在
  • 寻找连续重复序列的算法

    我正在寻找一种算法 可以在基因组序列中找到短串联重复 基本上 给定一个非常长的字符串 它只能包含 4 个字符 ATCG 我需要找到彼此相邻的 2 5 个字符长之间的短重复 前任 TACATGAGATCATGATGATGATGATGGAGCT
  • 使用构造函数注入进行 Spring Auto 组件扫描

    我知道如何单独使用自动组件扫描和构造函数注入 http www mkyong com spring spring auto scanning components http www mkyong com spring spring auto
  • 如何从 py2neo 获取自动节点 ID?

    我正在使用 py2neo 3 1 2 版本和 Neo4j 3 2 0 我有一个问题 在 Neo4J 的 Web 界面上 我可以运行以下查询来获取节点 id MATCH n Person RETURN ID n 我想知道 py2neo API
  • 适用于 Firefox 的 Javascript 内存分析器

    Firefox 是否有工具 插件 功能可以转储您在页面 脚本中创建的 Javascript 对象的内存使用情况 我了解 Firebug 的分析器 但我想要的不仅仅是时间 类似于 Yourkit 用于 Java 内存使用情况分析的功能 原因是
  • 将数据传递到链下游的中间件

    当我将中间件注册为请求管道的一部分时 如何通过中间件链传递数据 最终可在 MVC 控制器操作中访问 例如 我已经实现了自定义中间件来对我的请求进行身份验证 但是如何将身份验证数据 例如身份验证结果和附加数据 沿着中间件链传递 最终希望从 M
  • 自定义 django admin ChangeForm 模板/添加自定义内容

    我可以将 蹩脚的 静态文本插入到更改表单管理页面上 但我真的希望它使用当前正在编辑的对象的上下文 例如 我想对 URL 中的对象更改进行格式化 以包含外键连接对象的 ID obj 作为链接 我的管理对象 class MyObjectChan
  • 表格中的垂直和水平标题?

    如何获得具有水平和垂直标题的表格 So e g header1 header2 header3 header1 1 1 1 header2 2 2 2 header3 3 3 3 就像 UlrichSchwarz所说 你可以使用 th 代替
  • 请求:cert 和 verify 之间有什么区别?

    证书和验证有什么区别 来自文档 verify 可选 如果为 True 则将验证 SSL 证书 还可以提供 CA BUNDLE 路径 cert 可选 如果是字符串 则为 ssl 客户端证书文件 pem 的路径 如果是元组 则为 cert ke
  • 使用 Apache POI 将文件嵌入到 Excel 中的 XSSF 工作表中

    我已经发现奇异鸟翼 https stackoverflow com users 2066598 kiwiwings answer https stackoverflow com a 17757439 63436关于如何使用 Apache P
  • 使用 LINQ 查询和创建具有一对多关系的对象

    在数据库中 我有两个具有一对多关系的表 orders suborders id id name order id name 我想查询这些表并最终得到一个订单对象列表 每个对象都包含一个子订单对象列表 或空列表 我还想在单个数据库查询中执行此