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
});
从数据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对您的生产非常有利可图。