实体框架:按

时间:2016-01-12 15:08:25

标签: c# entity-framework entity-framework-6

我正在使用Entity Framework Code First,并且有以下POCO代表我的数据库中的表。

public class LogEntry
{
    public int Id {get; set;}
    public DateTimeOffset TimeStamp {get;set;}
    public string Message {get; set;}
    public string CorrelationId {get; set;}
}

CorrelationId不是唯一的。表中通常会有多个具有相同CorrelationId的记录,该字段用于跟踪哪些日志条目对应于哪个请求。

然后我有另一个对象,让我通过CorrelationId对这些日志条目进行分组。此对象不会映射回数据库中的任何表。

public class AuditTrail
{
    public string CorrelationId {get; set;}
    public DateTimeOffset FirstEvent {get; set;}
    public List<LogEntry> LogEntries {get; set;}
}

我希望能够填充AuditTrail对象列表。问题在于我希望对它们进行排序,以便最新的Audit Trail记录位于顶部。我也正在进行分页,所以我需要在分组之前发生命令,以便返回正确的记录。即我不想得到结果,然后对它们进行排序。排序需要在返回数据之前进行。

我已经尝试了一些查询并最终得到了这个:

var audits = from a in context.LogEntries
                             group a by a.CorrelationId into grp
                             select grp.OrderByDescending(g => g.TimeStamp);

这给了我一个IQueryable<IOrderedEnumerable<LogEntry>>后面,我迭代来构建我的AuditTrail对象。问题是记录只在组内排序。例如,我将返回一个昨天的AuditTrail,然后是一周之前的一个,然后是今天的一个,但是在LogEntries列表中,所有这些条目都被排序。我想要的是AuditTrails基于TimeStamp列以降序返回,以便新的AuditTrails显示在UI表格的顶部。

我也尝试了这个查询(根据Entity Framework skip take by group by):

var audits = context.LogEntries.GroupBy(i => i.CorrelationId)
                               .Select(g => g.FirstOrDefault())
                               .OrderBy(i => i.TimeStamp)
                               .ToList();

这只返回每个相关ID的第一个LogEntry,当我希望它们全部按相关ID分组时。

2 个答案:

答案 0 :(得分:3)

我认为你要找的是这样的:

var audits = (from a in context.LogEntries
             group a by a.CorrelationId into grp
             let logentries = grp.OrderByDescending( g => g.TimeStamp)
             select   new AuditTrail
                      {
                          CorrelationId = grp.Key,
                          FirstEvent = logentries.First().TimeStamp,
                          LogEntries = logentries.ToList()
                      }).OrderByDescending( at => at.FirstEvent);

答案 1 :(得分:1)

out.write(bytes[])