LINQ查询-日期动态PIvot

本文关键字:动态 PIvot 日期 查询 LINQ | 更新日期: 2023-09-27 18:26:42

我正在开发一个应用程序,该应用程序使用Entity Framework 4从数据库中检索数据,然后将其显示在WPF DataGrid中。我检索到的数据如下:

SCHEMATIC_ID    SERIAL_NUM  OUTAGE_DATE POSITION    COMMENTS
1G1111G111G1    1199        4/17/2003   10          Filler
1G1111G111G1    1199        5/21/2004   10          Filler
1G1111G111G2    1962        4/17/2003   3           Filler
1G1111G111G2    1962        5/21/2004   3           Filler
1G1111G111G1    2017        5/21/2004   9           Filler
1G1111G111G1    226         5/21/2004   8   
1G1111G111G1    290         5/21/2004   6   
1G1111G111G1    291         5/21/2004   5   
1G1111G111G1    295         5/21/2004   1   
1G1111G111G1    65450       5/21/2004   3   
1G1111G111G1    65451       5/21/2004   9           Filler
1G1111G111G1    65453       5/21/2004   6           Filler
1G1111G111G1    65458       4/17/2003   6   
1G1111G111G1    65458       5/21/2004   6   
1G1111G111G1    65459       5/21/2004   7   

我需要调整数据,使日期成为一个动态列标题(我不知道会有多少日期),并且位置位于每个序列号/示意图的日期之下。它应该是这样的:

SCHEMATIC_ID    SERIAL_NUM  4/17/2003   5/21/2004   COMMENTS
1G1111G111G1    1199        10          10          Filler
1G1111G111G2    1962        3           3           Filler
1G1111G111G1    2017                    9           Filler
1G1111G111G1    226                     8   
1G1111G111G1    290                     6   
1G1111G111G1    291                     5   
1G1111G111G1    295                     1   
1G1111G111G1    65450                   3   
1G1111G111G1    65451                   9           Filler
1G1111G111G1    65453                   6           Filler
1G1111G111G1    65458       6           6   
1G1111G111G1    65459                   7   

我在微软论坛上找到了这个链接,但我没有成功,因为我真的不理解select语句中的Lambda。

这就是我从开始的工作

var query = (from p in context.PARTS_STAGING
              where p.TN == SelectedTN
              group p by new { p.PART_SERIAL_NUM, p.PART_SCH_NUM, p.COMMENTS } into g
              select new PartStaging()
              {
                   SerialNumber = g.Key.PART_SERIAL_NUM,   
                   SchNumber = g.Key.PART_SCH_NUM,
                   Position = g.GroupBy(f => f.OUTAGE_DATE).Select(m => new { ?? }) // <- This is the part I can't get to work
                   Comments = g.Key.COMMENTS
              });

LINQ查询-日期动态PIvot

从数据SCHEMATIC_ID SERIAL_NUM OUTAGE_DATE POSITION COMMENTS的映射开始。假设你收集了这些东西。Lamba与LINQ集成,因此投入训练时间是值得的,但这里的一些样本考虑到了scheama

using (var db = new mydatabaseentities()){
   var stuff = db.Database.SqlQuery<theTypeAbove>("Select * from table where...", SQLParms);
   var filtered = stuff.Where(p=>p.SCHEMATIC_ID < 1000).Select(p=>p.OUTAGE_DATE_POSITION).ToList();
   var filtered2 = stuff.Where(p=>p.SERIAL_NUM = 12345);
   var filtered3 = stuff.Where(p=>COMMENTS.Length>100); 
}
//IF you were able to get complete maps from EF and tables have good relations you could do this:
using (var db= new mydatabaseentitite()){
  var stuff = db.MyTable.Where(p=>p.SCHEMATIC_ID==99);
}

在第一个例子中,它展示了如何发出原始sql查询,这有时是必要的,但并不是说结果被投影到EF生成的实体类型中。Filtered示例显示如何只选择一个字段。而Filtered2示例显示了如何根据where条件选择所有字段。Filtered3展示了如何使用字符串函数来过滤数据库中的数据。最后,第二个示例展示了如何在EF中完成所有操作,"不使用原始sql,而仅使用LINQ"。

Lambdas只是一种简单的方法,本质上说在这里而不是那里做。它们是基于迭代器的概念构建的,因此您不必设置foreach循环。LINQ有大量支持Lambdas的方法,因此LINQ本身是物有所值的。这使得学习Lamdas对您的生产非常有利可图。