通过分组对 Linq 列表进行拆分

4
为了报告目的,我想把一系列采购订单拆分成多个列表,每个采购地址对应一个列表。我知道可以按采购地址对列表进行分组,但我的问题是如何将此采购地址的列表拆分成多个列表,并使用这些多个列表创建单独的报告文件。
代码:
(from o in orders
group o by new {field1, field2, field3, field4} into og
orderby og.Key.field1
select new ViewClass
{
    purchaseAddress = og.Key.field1,
    product = og.key.field2,
    count = og.count
}).ToList()

问题:如何将上面的列表分成多个列表,每个列表对应一个购买地址?


我认为你的问题更关注数据的呈现方式,即如何在屏幕上绘制。是这样吗? - Amritpal Singh
是的,在演示上有这个功能,但在我的情况下是在报告文件(rdlc)中。对于每个购买地址,我想创建一个特定的PDF文件。目前,该报告文件是以单独页面的形式创建所有地址的。这个文件必须被分割成多个文件,可以通过电子邮件发送到每个地址。 - Luuk Krijnen
您正在创建包含所有数据的单个PDF,需要在分组字段“购买地址”上添加分页符。 - Amritpal Singh
我不太明白为什么你不能使用 group 子句。它会将列表分成多个子列表,正如你所希望的那样。 - GregRos
@amritpal-singh:我有分页符,但它仍然是单个文件。如果有多个文件,我可以将每个购买订单的地址发送给他们,而无需找出哪一部分是属于他们的。如果4个客户订购产品,则这些订单会为每个生产者产生多个内部订单。 - Luuk Krijnen
@LuukKrijnen,您需要为每个地址进行迭代并生成单独的PDF文件。您不能像创建一个PDF文件然后按地址拆分那样操作。 - Amritpal Singh
3个回答

11

我认为有一个内置函数可以实现你想要的功能。如果我假设你的代码被分配给了一个名为query的变量,那么你可以这样写:

ILookup<string, ViewClass> queryLists = query.ToLookup(x => x.purchaseAddress);

这基本上创建了一个列表的列表,你可以像访问字典一样访问它,但是每个值都是一个包含零个或多个值的列表。类似于:

IEnumerable<ViewClass> someList = queryLists["Some Address"];

1
由于不知道有多少可用地址以及哪些地址可用,我使用了以下代码:foreach (var list in querylists) { dosomething(querylist[list.Key]);} - Luuk Krijnen

2

只需将每个组转换为列表。

select new ViewClass 
{ 
    purchaseAddress = og.Key.field1, 
    product = og.key.field2, 
    count = og.count,
    List = og.ToList()
}).ToList();

哦,你的实体分组方式和页面分组方式不同...只需重新分组即可。
List<ViewClass> classes = (
  from o in orders   
  group o by new {field1, field2, field3, field4} into og   
  orderby og.Key.field1   
  select new ViewClass   
  {   
    purchaseAddress = og.Key.field1,   
    product = og.key.field2,   
    count = og.count   
  }).ToList();

List<List<ViewClass>> regrouped = (
  from c in classes
  group c by c.purchaseAddress into g
  select g.ToList()
).ToList();

0

另一个你可以使用的简单内置函数是GroupBy函数。它执行与ToLookup类似的工作,但意味着你的新列表是IQuerable,而不是像字典和其他一些东西(参见这个文章以获得良好的分解)。

var newList = orders.GroupBy(x => x.field1);

这将返回一个由您指定的字段分组的列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接