【问题标题】:Using Linq to GroupBy and Case When via datatable通过数据表使用 Linq 到 GroupBy 和 Case When
【发布时间】:2019-09-26 19:39:17
【问题描述】:

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"],
            }
          ));

【问题讨论】:

  • 我认为该 SQL 中不需要 group by。这是完整的声明吗?你想通过使用 group by 来达到什么目的?
  • 嗨,Ben,很抱歉输入了错误的代码。我已经在编辑我的代码了。请再试一次。

标签: c# linq datatable group-by case-when


【解决方案1】:

您需要先按 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"],
            }
          ));

【讨论】:

  • 谢谢猫王,是的。实际上,每个 LN 都有更多的行。请再次查看我的数据表。对于第一个信息,我们深表歉意。
  • 我试过了。我收到错误“对象引用未设置为对象的实例”。在数据。你有其他建议吗?谢谢
  • 现在知道了!!非常感谢猫王,我在最后一行将您的代码更改为 DueDate = rr.OrderBy(r1 => r1["Test_Item_Code"] == "V0001").First()["Test_Data"], DueDate2 = rr .OrderBy(r1 => r1["Test_Item_Code"] == "V0002").First()["Test_Data"]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多