Использование Linq для GroupBy и Case When через datatable - PullRequest
2 голосов
/ 09 мая 2019

enter code here У меня есть Datatable, как это:

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

Мне нужно, чтобы мой Datatable был таким:

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

1 Ответ

0 голосов
/ 09 мая 2019

Вам нужно сгруппировать по 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"],
            }
          ));
...