Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用linq分组_C#_Linq - Fatal编程技术网

C# 用linq分组

C# 用linq分组,c#,linq,C#,Linq,有人能告诉我我的qry有什么问题吗?是的,您试图在Select调用中使用x,但它超出了范围。另外,您试图直接使用名称,但它不是分组键的一部分。最后,您尝试在select中选择一个订单,而不是一组订单。我想你想要这个: Custtomer.Name="A" Customer.ID="1" Customer.OrderList = ListOfOrders with "01", "02", "03" Customer.OrderList[0].ItemList = ListOfItems with

有人能告诉我我的qry有什么问题吗?

是的,您试图在
Select
调用中使用
x
,但它超出了范围。另外,您试图直接使用
名称
,但它不是分组键的一部分。最后,您尝试在select中选择一个订单,而不是一组订单。我想你想要这个:

Custtomer.Name="A"
Customer.ID="1"
Customer.OrderList = ListOfOrders with "01", "02", "03"
Customer.OrderList[0].ItemList = ListOfItems with that order Item1, Item2, Item3


Custtomer.Name="B"
Customer.ID="2"
Customer.OrderList = ListOfOrders with "04", "05"
Customer.OrderList[0].ItemList = ListOfItems with that order Item4, Item5
假设CustID是唯一的(因此每次都会得到相同的名称),根据Achim的回答,您可以只按CustID分组,然后以第一个客户作为名称-但就个人而言,我更喜欢将密钥中的所有“每个客户”数据分组,因为这是您分组的逻辑依据

编辑:要回答已编辑的问题,可以填充
OrderList
属性,如下所示:

var qry = dList.GroupBy(x => new { CustID = (string) x["CustID"],
                                   Name = (string) x["Name"] })
               .Select(g => new Customer {
                          ID = g.Key.CustID,
                          Name = g.Key.Name,
                          OrderList = g.Select(x => new Order {
                                 // Indentation bad to avoid scrolling!
                                 OrderNumber = (string) x["OrderNumber"] })
                                       .ToList()
                       })
               .ToList();
。。。但老实说,到那时它已经变得相当混乱了。

var qry=dList.GroupBy(x=>x[“CustID”])。选择(g=>newcustomer
OrderList = g.GroupBy(t=> (string) t["OrderNumber"]).Select(x => new Order
{
    OrderNumber = x.Key,
    ItemList = x.Select(y => new Item { 
                              ItemName = (string) y["ItemName"]
                        }).ToList()
}).ToList()
{ ID=g.Key.ToString(), Name=g.First()[“Name”], OrderList=g.Select(o=>newlist(新订单{OrderNumber=o[“OrderNumber”]})) }).ToList();
我必须仅按CustID分组,并且仍然可以访问Name。在实际场景中,有30个字段必须被选择,而分组是基于一个字段进行的。@Asdfg:如果您只对一个字段进行分组,那么要将哪个条目用于“名称”字段?具有相同CustID的两个条目可能具有不同的名称值。。。你想要哪个名字?你们怎么能写出这么酷的查询。有什么工具可以做到这一点吗?我对LINQ有什么不理解,阻止我写这样的查询?如果我编写传统的ForEach循环呢?这会不会是一个糟糕的编程,因为我认为LINQ内部也会做同样的事情。我错了吗?@Asdfg:我想这只是经验。我已经写了很多LINQ查询:)当你想在每次迭代中采取行动时,编写foreach循环是可以的——但是如果你只是有效地计算一个值/集合,LINQ提供了一种更具声明性的方法。那么我想我会继续回到这里寻求LINQ帮助,直到我获得专家级的知识。
OrderList = g.GroupBy(t=> (string) t["OrderNumber"]).Select(x => new Order
{
    OrderNumber = x.Key,
    ItemList = x.Select(y => new Item { 
                              ItemName = (string) y["ItemName"]
                        }).ToList()
}).ToList()
var qry = dList.GroupBy(x => x["CustID"]).Select(g => new Customer
        {
            ID = g.Key.ToString(),
            Name = g.First()["Name"],
            OrderList=g.Select(o => new List<Order>(new Order{ OrderNumber=o["OrderNumber"]}))
        }).ToList();