Linq多重联接和分组依据

本文关键字:Linq | 更新日期: 2024-09-20 01:17:51

所以我甚至不确定我所做的是否可行,但我基本上是尝试取4个不同的列表,将它们连接到一个对象中。

唯一的问题是,orderLineItems将是一个集合,我不太清楚将其放入适当列表项的最佳方法。我知道我可能需要做一个分组,但当我做选择时,分组似乎打破了分配

需要澄清的一件事是:挑战是获取行项目-如果我不分配行项目并从查询中删除任何行项目引用,数据就会正确填充,但是,由于行项目是一个集合,我无法找出在Select中分配行项目的正确方法-希望这是有意义的。。

var ordersa = (from order1 in orderList
  join person in customerAccountPeople
       on order1.CustomerAccountPersonId equals person.CustomerAccountPersonId
  join subject in subjectList
       on order1.SubjectId equals subject.SubjectId
  from orderLineItem in orderLineItemList
  join order in orderList
       on orderLineItem.OrderId equals order.OrderId
  group orderLineItem by orderLineItem.OrderId into orderLineItems
  select new OrderList()
  {
      Customer = person,
      Subject = subject,
      Order = order1,
      LineItems = orderLineItems
  }).ToList();

Linq多重联接和分组依据

在您当前的解决方案中,您基本上是将每个行项目与其订单、主题和人员连接起来,然后按订单id对结果列表进行分组。这不是您想要的:您希望将订单、主题、人员与行项目列表放在一起。

您应该事先对行项目进行分组。既然您澄清了所有内容都在内存中,那么您就可以通过订单id:处理订单行项目的ILookup

 // GroupBy works just as well
 var orderLineItemsByOrderId = orderLineItemList.ToLookup(ol => ol.OrderId);
 var ordersa = (
     from order1 in orderList
     join person in customerAccountPeople
     on order1.CustomerAccountPersonId equals person.CustomerAccountPersonId
     join subject in subjectList
     on order1.SubjectId equals subject.SubjectId
     let orderLineItems = orderLineItemsByOrderId[order1.OrderId]
     select new 
     {
         Customer = person,
         Subject = subject,
         Order = order1,
         LineItems = orderLineItems
     }).ToList();
    var ordersa = (from order1 in orderList
                   join person in customerAccountPeople
                        on order1.CustomerAccountPersonId equals person.CustomerAccountPersonId
                   join subject in subjectList
                        on order1.SubjectId equals subject.SubjectId
                   select new OrderList()
                   {
                       Customer = person,
                       Subject = subject,
                       Order = order1,
                       LineItems =    ( from orderLineItem in orderLineItemList
                                           join order in orderList
                                                on orderLineItem.OrderId equals order1.OrderId
                                           group orderLineItem by orderLineItem.OrderId into orderLineItems )
                   }).ToList();