LINQ连接关联表的值

时间:2014-03-19 13:36:34

标签: c# asp.net sql linq

让我们说一个具有以下结构的基本SQL数据库:

客户表

客户ID
名称
邮编
电子邮件

订单表

订单ID
客户ID
说明

项目表

物品编号
订单ID
名称
费用

因此,客户可以拥有多个订单,订单可以有很多商品。

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

客户名称|客户电邮|订单商品名称

因此,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属性为空。

1 个答案:

答案 0 :(得分:4)

获得结果后

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。