enter code here我有一个像这样的数据表:

LN             Test_Code        Name       Test_Item_Code        Test_Data
0107001             A010         Yo             V0001               1
0107001             A010         Yo             V0002               2
0107001             C040         Yo             V0002               1
0107001             C040         Yo             V0002               2
0107002             C040         JC             V0001               3
0107002             C040         JC             V0002               4
0107003             C040         kk             V0001               5
0107003             C040         kk             V0002               6


我需要这样获取数据表:

LN             Test_Code     Name     DueDate(V0001)        DueDate2(V00002)
0107001          A010         Yo           1                    2
0107001          C040         Yo           1                    2
0107002          C040         JC           3                    4
0107003          C040         kk           5                    6


如果可以的话,这是我的SQL命令。

select LN, Test_Code, Name,
case when Test_Item_Code = 'V0001' then Test_Data else '' end as DueDate(V0001),
case when Test_Item_Code = 'V0002' then Test_Data else '' end as DueDate2(V0002)
From dt Group by LN, Test_Code, Name


这是我的源代码。它仍然是错误的,因为我不知道如何获取字段Test_Item_Code和Test_Data以防万一。

DataTable dt = services.getData();
var data = dt.AsEnumerable()
          .GroupBy(r1 => new
         {LN = r1["LN"],
          Test_Code = r1["Test_Code"],
          Name = r1["Name"],
          Test_Item_Code = r1["Test_Item_Code"],
          Test_Data = r1["Test_Data"]
         }).Select(g => new
         {LN = g.Key.LN,
          Test_Code = g.Key.Test_Code,
          Name = g.Key.Name,
          DueDate = g.Key.Test_Item_Code == "V0001" ? g.Key.Test_Data : "",
          DueDate2 = g.Key.Test_Item_Code == "V0002" ? g.Key.Test_Data : ""
         });


我从上面的代码中得到了这样的数据:

LN             Test_Code     Name     DueDate(V0001)        DueDate2(V00002)
0107001          A010         Yo           1
0107001          A010         Yo                                2
0107001          C040         Yo           1
0107001          C040         Yo                                2
0107002          C040         JC           3
0107002          C040         JC                                4
0107003          C040         kk           5
0107003          C040         kk                                6


如有任何帮助/建议,我们将不胜感激。我对linq很陌生。



var data = dt.Select().GroupBy(r1 => r1["LN"])
         .SelectMany(r => r.GroupBy(g => g["Test_Code"]).Select(rr =>
            new
            {
                LN = r.Key,
                Test_Code = rr.Key,
                Name = rr.First()["Name"],
                DueDate = rr.OrderBy(r1 => r1["Test_Item_Code"] == "V0001").First()["Test_Data"],
                DueDate2 = rr.OrderBy(r1 => r1["Test_Item_Code"] == "V0002").First()["Test_Data"],
            }
          ));

最佳答案

您需要按NL分组,然后按Test_Code分组,这是一个示例:

var data = dt.Select().GroupBy(r1 => r1["LN"])
         .SelectMany(r => r.GroupBy(g => g["Test_Code"]).Select(rr =>
            new
            {
                LN = r.Key,
                Test_Code = rr.Key,
                Name = rr.First()["Name"],
                DueDate = rr.FirstOrDefault(r1 => r1["Test_Item_Code"] == "V0001")["Test_Data"],
                DueDate2 = rr.FirstOrDefault(r1 => r1["Test_Item_Code"] == "V0002")["Test_Data"],
            }
          ));

关于c# - 通过数据表使用Linq对GroupBy和Case进行分组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56051441/

10-11 01:54
查看更多