简体   繁体   English

与linq分组

[英]grouping with linq

class Customer
{
    public string ID { get; set; }
    public string Name { get; set; }
    public List<Order> OrderList { get; set; }
}

class Order
{
    public string OrderNumber { get; set; }
    public List<Item> ItemList { get; set; }
}

class Item
{
    public string ItemName { get; set; }
}


    static void Main(string[] args)
    {

        System.Data.DataTable dt = new System.Data.DataTable();
        dt.Columns.Add("CustID");
        dt.Columns.Add("Name");
        dt.Columns.Add("OrderNumber");
        dt.Columns.Add("ItemName");

        dt.Rows.Add("1", "A", "O1", "Item1");
        dt.Rows.Add("1", "A", "O1", "Item2");
        dt.Rows.Add("1", "A", "O1", "Item3");

        dt.Rows.Add("1", "A", "O2", "Item4");
        dt.Rows.Add("1", "A", "O2", "Item5");

        dt.Rows.Add("1", "A", "O3", "Item1");

        dt.Rows.Add("2", "B", "O4", "Item1");
        dt.Rows.Add("2", "B", "O4", "Item2");

        dt.Rows.Add("2", "B", "O5", "Item3");


        dt.AcceptChanges();

        List<DataRow> dList = dt.AsEnumerable().ToList();


        //This is not working
        var qry = dList.GroupBy(x => x["CustID"])
                        .Select(g => new Customer
                        {
                            ID = g.Key.ToString(),
                            Name = g.First()["Name"].ToString(),
                            OrderList = g.GroupBy(t=> t["OrderNumber"]).Select(x => new Order
                            {

                                OrderNumber = x.First()["OrderNumber"].ToString(),
                                ItemList = g.GroupBy(u => u["OrderNumber"]).Select(y => new Item { ItemName = y.First()["ItemName"].ToString() }).ToList()
                            }).ToList()
                        }).ToList();
    }

I am trying to get output like this 我正在尝试获得这样的输出

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

Can someone tell me whats wrong with my qry? 有人可以告诉我我的qry有什么问题吗?

Yes, you're trying to use x within the Select call, but it's out of scope. 是的,您正在尝试在Select调用中使用x ,但超出范围。 Also, you're trying to use the Name directly, but it's not part of the grouping key. 另外,您尝试直接使用“ Name ,但这不是分组键的一部分。 Finally, you're trying to select a single order in your Select, not a group of them. 最后,您尝试选择“选择”中的单个订单,而不是一组。 I think you want this: 我想你想要这个:

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

Assuming that CustID is unique (so you'll get the same Name each time) you can group just by CustID and then take the first customer for the Name, as per Achim's answer - but personally I prefer to group all the "per customer" data in the key, as that's logically what you're grouping on. 假设CustID是唯一的(因此您每次都会获得相同的名称),则可以仅按CustID进行分组,然后按照Achim的回答选择名称的第一个客户-但就我个人而言,我更喜欢将所有“每个客户”分组密钥中的数据,因为这在逻辑上就是您要分组的数据。

EDIT: To answer the edited question, you could populate the OrderList property something like this: 编辑:要回答编辑后的问题, 可以填充OrderList属性,如下所示:

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

... but to be honest it's getting pretty messy by then. ...但是说实话,到那时它已经变得非常混乱。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM