假设有一个基本的SQL数据库,其结构如下:
客户表客户ID
名称
邮编
电子邮件
订单ID
客户ID
描述
项ID
订单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属性为空。
有结果后
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。