C# 实体框架:排序依据,然后分组依据
我首先使用实体框架代码,下面的POCO表示数据库中的一个表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
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);