选择最新记录并将结果添加为新列

时间:2017-07-22 23:02:37

标签: c# sql-server entity-framework linq

我有以下数据库 enter image description here

我的学生记录特定的sutdent是 enter image description here

如何根据最新的studentRecords获取最新的3 Records.RecordDate 所以对于每个sutdent,行将有ReportItems.ReportItemName ReportItems.TotalPSR,, Students.FullName,+添加以下列: 基于RecordDate的最新studentRecords并显示psr + reordsNames + recordDate,以便一行看起来像这样

enter image description here

这甚至可能吗? 我如何使用EF6执行此操作以及SQL选择语句

2 个答案:

答案 0 :(得分:1)

您可以使用Row_Number和Pivot,如下所示:

2,"Anna ROGOWSKA"
2,"Anna BARANSKA"

答案 1 :(得分:1)

为您的EF实体设置正确的映射以关联学生,学生记录和记录,然后您应该能够使用以下内容在EF中完成此操作:

var results = testContext.Students
    .SelectMany(s => s.StudentRecords.OrderByDescending(sr => sr.Record.RecordDate).Take(3))
    .GroupBy(x => x.Student)
    .ToList();

这将给出一个分组结构中每个学生的结果,其中分组在学生上,分组值为StudentResults。从那里,您可以从“密钥”中提取学生详细信息,而每个结果都是按降序排列的(最多)3个最新学生记录的集合。您将需要处理结果数< 3。

作为一个简单的例子提取...

foreach (var studentGrouping in results)
{
   studentName = studentGrouping.Key.FullName;
   psr1 = studentGrouping[0].PSR;
   recordName1 = studentGrouping[0].Record.RecordName;
   recordDate1 = studentGrouping[0].Record.RecordDate;
   // ... etc.
}

现在对上述解决方案的一个警告是它将在记录上调用延迟加载,因此每个学生最多可以达到3次点击。奇怪的是我尝试使用.Include(s => s.StudentRecords.Select(r => r.Record))或在SelectMany()之后尝试.Include(r => r.Record)来缓解此问题。初始查询看起来包含了Records的列,它仍然触发了延迟加载。

如果有人可以提供纠正以解决延迟负载,我很乐意听到它。添加Include语句后,我对它们感到有些惊讶。

如果您的对象模型更复杂,例如学生/记录中的大量字段等,那么我建议更改上面的内容以返回匿名类型结构,以仅检索您需要填充的值结果。对于简单的结构,上面的说法没问题。

例如,如果学生有30列,但我们只关心ID和名称:

var results = testContext.Students
    .SelectMany(s => s.StudentRecords.OrderByDescending(sr => sr.Record.RecordDate).Take(3))
    .Select( sr=> new {sr.Student.StudentId, sr.Student.FullName, sr.PSR, sr.Record.RecordId, RecordName = sr.Record.Name})
    .GroupBy(x => new{StudentId, FullName})
    .ToList();

这将返回一个结构,其中Key是一个只包含StudentId和Name的匿名类型,其中分组值是包含该学生的记录详细信息的类型。这样做的好处是只需将单个查询中所需的数据返回到数据库。