通过数据表使用 Linq to GroupBy 和 Case When

Using Linq to GroupBy and Case When via datatable

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 以区分 when.

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

任何 help/advice 如果可能的话,我们将不胜感激。我对 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"],
            }
          ));