【问题标题】:LINQ concatenate values from associated tablesLINQ 连接关联表中的值
【发布时间】:2014-04-25 19:16:12
【问题描述】:

假设有一个基本的 SQL 数据库,其结构如下:

客户表

客户 ID
名称
邮政编码
电子邮件

订单表

订单编号
客户编号
说明

项目表

物品编号
订单编号
名称
费用

所以一个客户可以有很多订单,而一个订单可以有很多商品。

为了获得以下结果(其中 Order Item Names 结果是逗号分隔的字符串),运行最合适的 LINQ 查询是什么:

客户名称 |客户邮箱 |订购商品名称

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

我已经按预期完成了以下工作,它将为每个订单项返回一个结果:

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
                         };

2014 年 3 月 21 日编辑

在某些情况下,没有关联的 OrderItems,在这种情况下仍应返回 CustomerSearchResult,但 ItemNames 属性为空。

【问题讨论】:

    标签: c# asp.net sql linq


    【解决方案1】:

    有结果后

    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 from me AND 我想添加一个建议,即在您的数据库中使用VIEW 以虚拟地统一数据库中的这些表,然后只需查询VIEW。比在您的应用程序/服务中进行所有加入等操作更容易、更快捷。
    • @Sergey 谢谢谢尔盖,很好的答案。但是,我最近发现在某些情况下没有关联的 OrderItems,在这种情况下仍应返回 CustomerSearchResult 但 ItemNames 属性为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    相关资源
    最近更新 更多