LINQ查询 - 日期的动态PIvot

时间:2014-10-16 13:57:40

标签: c# linq visual-studio-2010 .net-4.0 pivot

我正在使用一个使用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   

我需要转动数据,以便日期变为动态列标题(我不知道将会有多少日期),并且该位置属于每个SN / Schematic的日期。它应该是这样的:

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   

我在微软论坛上找到this link,但我没有成功,因为我并不真正理解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
              });

任何帮助肯定会受到赞赏。

1 个答案:

答案 0 :(得分:0)

从您的数据地图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显示了如何使用字符串函数来过滤db中的数据。最后,第二个例子展示了如何在EF&#34中完成所有操作;不使用原始SQL而只使用LINQ&#34;。

Lambda只是简单地说在这里而不是在那里做的方法。它们建立在迭代器的概念之上,因此您不必设置foreach循环。 LINQ拥有大量支持Lambdas的方法,因此LINQ本身也值得在Gold中占据重要地位。这使得学习Lamdas对您的制作非常有利可图。