如何使用C# Linq处理DataRow以分组和处理数据

cngwdvgl  于 2023-06-19  发布在  C#
关注(0)|答案(1)|浏览(255)

我正在使用存储过程从SQL Server获取DataTable。下面显示了数据的简化版本

DataTable dt = new DataTable("Products");
        dt.Columns.Add("ProductID");
        dt.Columns.Add("CustomerID");
        dt.Columns.Add("CustomerState");
        dt.Columns.Add("CustomerCity");

        // DataRow row1 = table1.NewRow();
        object[] o = { 1, 1, "TX", "Austin" };
        dt.Rows.Add(o);

        object[] o1 = { 2, 2, "AZ", "Phoenix" };
        dt.Rows.Add(o1);

        object[] o2 = { 2, 3, "OK", "Oklahoma" };
        dt.Rows.Add(o2);

        object[] o3 = { 2, 4, "CO", "Denver" };
        dt.Rows.Add(o3);

        object[] o4 = { 3, 1, "TX", "Austin" };
        dt.Rows.Add(o4);

我计划按ProductID对数据进行分组。分组后,每个ProductID应该只有一行。如果有多个ProductID,那么其他列应该用分号分隔,如下所示:
| 产品编号|客户ID|客户状态|客户城市|
| - -----|- -----|- -----|- -----|
| 1| 1| TX|奥斯汀|
| 2|二、三、四|AZ;OK;CO|Phoenix城;俄克拉荷马州;丹佛|
| 3| 1| TX|奥斯汀|
我认为这是ADO.NET做不到的。所以我开始使用LINQ,如下所示。然而

DataTable dt = ProcessData();//Data is from the above code where the DataTable is created and populated manually

var results = from p in dt.AsEnumerable()
              group p by p.Field<string>("Productid") into g
              select new
                     {
                          productid = g.Key,
                          items = g.ToList(),
                          //customerid = g.Field<string>("customerid"),
                          //customerstate = g.Field<string>("customerstate"),
                          //customercity = g.Field<string>("customercity")
                      };

我不得不注解掉三行,因为我得到了以下错误:
CS 1929:“IGrouping<string,DataRow>”不包含“Field”的定义,并且最佳扩展方法重载“DataRowExtensions.Field(DataRow,DataColumn)”需要类型为

2hh7jdfx

2hh7jdfx1#

您可以使用下面的代码在LINQ中基于组进行连接

var results = 
   from p in dt.AsEnumerable()
   group p by p.Field<string>("Productid") into g
   select new
    {
      productid = g.Key,
      customerid = string.Join(",", g.Select(i => i.Field<string>("customerid"))),
      customerstate = string.Join(",", g.Select(i => i.Field<string>("customerstate"))),
       customercity = string.Join(",", g.Select(i => i.Field<string>("customercity"))),
      
     };

相关问题