【问题标题】:LINQ Query - Dynamic PIvot on DateLINQ 查询 - 日期动态 Pivot
【发布时间】:2014-10-16 13:57:40
【问题描述】:

我正在开发一个应用程序,该应用程序使用 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_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   

我在 Microsoft 论坛上找到了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
              });

【问题讨论】:

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


    【解决方案1】:

    从您的数据 SCHEMATIC_ID SERIAL_NUM OUTAGE_DATE POSITION COMMENTS 的地图开始。 假设你有这些东西的集合。 Lamba 与 LINQ 集成,因此投入训练时间是值得的,但这里的一些示例很快就会考虑到该模式

    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 本身在 Gold 中是值得的。这使得学习 Lamdas 为您的生产带来高利润。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多