C# LINQ连接关联表中的值

C# LINQ连接关联表中的值,c#,asp.net,sql,linq,C#,Asp.net,Sql,Linq,假设有一个具有以下结构的基本SQL db: 客户表 客户ID 名称 邮政编码 电子邮件 订单表 订单ID 客户ID 描述 项目表 项目ID 订单ID 名称 成本 因此,客户可以有许多订单,订单可以有许多项目 如果订单项目名称结果是逗号分隔的字符串,为了获得以下结果,最合适的LINQ查询是什么: 客户名称|客户电子邮件|订单商品名称 因此,Orders表实际上就像Customer表和Order Items表之间的链接表。然后,我希望将与所有订单关联的所有项目的名称连接到一个字符串中,并以与cust

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

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

订单表 订单ID
客户ID
描述

项目表 项目ID
订单ID
名称
成本

因此,客户可以有许多订单,订单可以有许多项目

如果订单项目名称结果是逗号分隔的字符串,为了获得以下结果,最合适的LINQ查询是什么:

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

因此,Orders表实际上就像Customer表和Order Items表之间的链接表。然后,我希望将与所有订单关联的所有项目的名称连接到一个字符串中,并以与customer details相同的结果返回它

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

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
                         };
IQueryable customerSearchResult=来自数据库中的客户。客户
在数据库中加入订单。客户订单。CustomerId等于订单。CustomerId
order.OrderId等于item.OrderId上的db.OrderItems中的联接项
其中customerId.Equals(userId)
选择新CustomerSearchResult{
customerName=customer.Name,
customerEmail=customer.Email,
itemName=item.Name
};
编辑2014年3月21日

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

得到结果后

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。

在获得结果后

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我和我想添加一个建议,即在数据库中使用
视图
,将这些表虚拟地统一到数据库中,然后只需查询
视图
。比在您的应用程序/服务中执行所有加入等操作更简单、更快。@Sergey谢谢Sergey,回答得很好。但是,我最近发现,在某些情况下,将不存在关联的OrderItems,在这种情况下,CustomerSearchResult仍应返回,但ItemNames属性为空。+1,我希望添加一个建议,即,要在数据库中使用
视图
,将这些表虚拟地统一到数据库中,只需查询
视图
。比在您的应用程序/服务中执行所有加入等操作更简单、更快。@Sergey谢谢Sergey,回答得很好。但是,我最近发现,在某些情况下,没有关联的OrderItems,在这种情况下,CustomerSearchResult仍应返回,但ItemNames属性为空。