我有两个列表,分别是orderHeaders
和orderLines
。这是数据库中的两个相关表,但是当我拉它们时,我必须将它们分别拉成两个不同的列表,然后稍后将它们相互映射。我现在有一个解决方案,但是考虑到我有大约40万个标题和100万以上的行,因此性能有些令人失望。
这是我下面的代码。这是遍历并在两个列表中查找成员的标准方法,还是C#中有更优化的方法?
var OutboundOrderHeaders =
DbContext.Context.Database.SqlQuery<OutboundOrderDTO>(queryString, parameter);
var OutboundOrderHeadersList = OutboundOrderHeaders.ToList();
var OutboundOrderLine =
DbContext.Context.Database.SqlQuery<OutboundOrderLineDTO>(queryStringLine, parameter2);
var OutboundOrderLineList = OutboundOrderLine.ToList();
for(var i = 0; i < OutboundOrderHeadersList.Count(); i++)
{
var LineToAdd = OutboundOrderLineList
.Where(x => x.OutboundNumber == OutboundOrderHeadersList[i].OutboundNumber)
.ToList() ;
OutboundOrderHeadersList[i].OrderLine = LineToAdd;
}
return OutboundOrderHeadersList;
答案 0 :(得分:2)
正如评论中指出的那样,我真的很努力在数据库中而不是在内存中做到这一点。但是要在内存中执行此操作,ToLookup
可能是正确的方法:
// Note: here I've renamed used outboundOrderLines where you've got OutboundOrderLineList,
// and orderHeaders where you've got OutboundOrderHeadersList, as simpler
// and more conventional variable names.
var linesByOutboundNumber = outboundOrderLines.ToLookup(line => line.OutboundNumber);
foreach (var orderHeader in orderHeaders)
{
orderHeader.OrderLine = linesByOutboundNumer[orderHeader.OutboundNumber].ToList();
}
这将通过outboundOrderLines
一次(而不是针对每个订单标头对其进行迭代)来构建从出站号码到“具有该出站号码的所有行”的地图。