C# Linq多重联接和分组依据

C# Linq多重联接和分组依据,c#,asp.net,linq,C#,Asp.net,Linq,所以我甚至不确定我所做的是否可行,但我基本上是想把4个不同的列表,加入到一个对象中 唯一的问题是,orderLineItems将是一个集合,我无法找到将其放入适当列表项的最佳方法。我知道我可能需要做分组练习,但当我做选择时,分组练习似乎会破坏作业 需要澄清的一点是:挑战在于获取行项目-如果我不分配行项目并从查询中删除任何行项目引用,数据将正确填充,但是,由于行项目是一个集合,我无法找到在选择中分配行项目的正确方法-希望这有意义 var ordersa = (from order1 in orde

所以我甚至不确定我所做的是否可行,但我基本上是想把4个不同的列表,加入到一个对象中

唯一的问题是,
orderLineItems
将是一个集合,我无法找到将其放入适当列表项的最佳方法。我知道我可能需要做分组练习,但当我做选择时,分组练习似乎会破坏作业

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

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();

在您当前的解决方案中,您基本上是将每个行项目与其顺序、主题和人员连接起来,然后根据订单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();

你试过使用
Include()
方法吗?我总是说:“如果你想写一个复杂的LINQ查询,你可能应该改为写一个存储过程!”。毫无疑问,这里有人可以为你创建一个monster LINQ语句。然而,就我而言,我发现将这些语句分解成比特有助于编写更可读的代码。所有的执行都保留到最后的
ToList()
调用,因此对于较小的查询没有惩罚。允许更简单的测试。这些列表已经从数据库中独立提取出来。它们已经是“ToList()'d”-我只需要将数据重新加入到这个新对象中。我不能使用include,这些数据集非常庞大,我已经缩小了所需的精确字段,以减少执行/返回数据所需的时间。此外,数据库是在移动到EF之前创建的。因此,DB存在一些问题(目前无法更改),这使得我无法在“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();