C# 实体框架:排序依据,然后分组依据

C# 实体框架:排序依据,然后分组依据,c#,entity-framework,entity-framework-6,C#,Entity Framework,Entity Framework 6,我首先使用实体框架代码,下面的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不是唯一的。表中通常会有多条具有相同Cor

我首先使用实体框架代码,下面的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;}
}
这给了我一个
IQueryable
,我迭代它来构建AuditTrail对象。问题是记录只在组内排序。例如,我将返回昨天的AuditTrail,后面是一周前的AuditTrail,后面是今天的AuditTrail,但在LogEntries列表中,所有这些条目都已排序。我想要的是AuditTrails根据TimeStamp列按降序返回,以便新的AuditTrails显示在UI上我的表的顶部

我还尝试了此查询(根据):


当我希望所有相关Id都按相关Id重新分组时,这只返回每个相关Id的第一个日志条目。

我想您要查找的是这样的内容:

var audits = (from a in context.LogEntries
             group a by a.CorrelationId into grp
             select new AuditTrail
             {
               CorrelationId = grp.Key,
               FirstEvent = grp.OrderBy(g=>g.TimeStamp).First().TimeStamp,
               LogEntries = grp 
             }).OrderByDescending(a=>a.FirstEvent)
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);

目前接受,因为数据看起来是正确的。明天将进行更严格的测试,并在必要时进行更新。好的,如果您有任何问题,请告诉我;)
var audits = (from a in context.LogEntries
             group a by a.CorrelationId into grp
             select new AuditTrail
             {
               CorrelationId = grp.Key,
               FirstEvent = grp.OrderBy(g=>g.TimeStamp).First().TimeStamp,
               LogEntries = grp 
             }).OrderByDescending(a=>a.FirstEvent)
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);