如何根据最新的studentRecords
获取最新的3 Records.RecordDate
所以对于每个sutdent,行将有ReportItems.ReportItemName ReportItems.TotalPSR,, Students.FullName
,+添加以下列:
基于RecordDate
的最新studentRecords并显示psr + reordsNames + recordDate,以便一行看起来像这样
这甚至可能吗? 我如何使用EF6执行此操作以及SQL选择语句
答案 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的匿名类型,其中分组值是包含该学生的记录详细信息的类型。这样做的好处是只需将单个查询中所需的数据返回到数据库。