当前位置: 首页 > 知识库问答 >
问题:

LINQ连接来自关联表的值

萧嘉茂
2023-03-14

假设有一个具有以下结构的基本SQL db:

客户ID
姓名
邮编
电子邮件

订单ID
客户ID
描述

项目ID
订单ID
名称
成本

所以一个客户可以有很多订单,一个订单可以有很多项目。

要运行什么最合适的LINQ查询来实现以下结果,其中订单项名称结果是逗号分隔的字符串:

客户名称|客户电子邮件|订单项目名称

因此,订单表实际上就像客户和订单项表之间的链接表。然后,我想将与所有订单关联的所有项目的名称连接到一个字符串中,并以与客户详细信息相同的结果返回。

我已按预期完成以下工作,将返回每个订单项的结果:

IQueryable<CustomerSearchResult> customerSearchResult = from customer in db.Customers
                         join order in db.Orders on customers.CustomerId equals order.CustomerId
                         join item in db.OrderItems on order.OrderId equals item.OrderId
                         where customerId.Equals(userId)
                         select new CustomerSearchResult {
                             customerName = customer.Name,
                             customerEmail = customer.Email,
                             itemName = item.Name
                         };

编辑21三月2014

在某些情况下,将不存在关联的OrderItem,在这种情况下,仍应返回Cust打火机搜索结果,但ItemNames属性为空。

共有1个答案

康恩
2023-03-14

等你有了结果之后

var query = from c in db.Customers
            join o in db.Orders on c.CustomerId equals o.CustomerId
            join i in db.OrderItems on o.OrderId equals i.OrderId
            where c.CustomerId == userId
            select new {
                CustomerName = c.Name,
                CustomerEmail = c.Email,
                ItemName = i.Name
            };

将它们分组并连接项目名称:

 var result = from r in query.AsEnumerable()
              group r by new { r.CustomerName, r.CustomerEmail } into g
              select new CustomerSearchResult {
                 CustomerName = g.Key.CustomerName,
                 CustomerEmail = g.Key.CustomerEmail,
                 ItemNames = String.Join(",", g.Select(r => r.ItemName))
              };

您应该在内存中进行名称连接,因为EF将无法将其转换为SQL。

 类似资料:
  • 一、本功能说明 可以自动批量的将内容里面的关键词语加上超链接 二、子功能导航 1.添加连接 2.管理连接 三、功能详解 1.添加规则 1).如何进入本功能 导航栏 选择扩展 -> 菜单栏 选择关联连接 -> 添加关联连接 2).界面解释 点击后弹出如下界面 界面详述 1). 关联连接名称: 您可以需要添加连接的关键字 2). 关联连接网址: 该关键字对应的网址 2.管理连接 1).如何进入本功能

  • 我有两个模型赋值和区域,每个都定义在单独的文件中,如下所示: Area.js: assignment.js: 当我试图用包含属性的区域信息(join)找到一些赋值时,我得到了一个错误,说:区域不关联到赋值! 提前谢谢你。

  • 问题内容: 我想将2个使用hibernate注释的实体与一个自定义连接子句关联起来。该子句具有通常的FK / PK相等性,但FK为null时也是如此。在SQL中,这类似于: 从我阅读的内容中,我应该在所有者实体上使用@WhereJoinTable批注,但是我对如何指定此条件感到困惑……尤其是它的第一部分-指的是联接实体的ID。 有人有例子吗? 问题答案: 这是一个使用标准父/子范例的示例,我认为应

  • 问题内容: 我想添加代表其他表计数的列。 我有3张桌子。 留言内容 主题 星星_吉文 我要结束于: Topic_Review 因此,基本上我想在3列中附加唯一值的计数(每个主题中给定的星数,在主题中具有消息的唯一用户以及每个主题中的唯一消息数)。 我希望最终也能够过滤类别(在两列中均可见)。 此外,我最终希望按加入的人数进行排序。例如,我将要有一个按钮,该按钮按升序按“星数”排序,或按降序按“用户

  • 问题内容: 我想在以下(简化的)数据库中应用JPA: 因此,一个节点可以具有多个权限,并且一个权限可以被多个节点引用。 我希望我的班级看起来像这样: 但是注释“ @ManyToMany”似乎仅可用于“ @JoinTable”,在这种情况下,它不可用(据我所知)。有人知道修改数据库之外是否还有其他方法吗? 问题答案: JPA不允许这样做,因为它需要外键来引用完整的主键以用于标识目的,并且它可能不适用

  • 我有两个实体帐户和头寸。POSITION表和ACCOUNT表有内容,但我认为至少应该有一行的POSITION_ACCOUNT表是空的。我可能做错了什么?以下是相关代码(我使用Eclipse Link 2.4.2: 就位: @许多私人名单账户; 在帐户: @ManyTo许多(mappdBy="帐户",抓取=FetchType. EAGER,级联=CascateType. PERSIST)@JoinT