gpt4 book ai didi

c# - Entity Framework : Order by and then group by

转载 作者:太空狗 更新时间:2023-10-29 23:13:30 26 4
gpt4 key购买 nike

我正在使用 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 记录位于顶部。我也在做分页,所以我需要 order by 在 group by 之前发生,以便返回正确的记录。即我不想得到结果然后对它们进行排序。排序需要在返回数据之前进行。

我尝试了一些查询,结果是这样的:

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 分组时,这只会返回每个关联 ID 的第一个 LogEntry。

最佳答案

我认为您正在寻找的是这样的东西:

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);

关于c# - Entity Framework : Order by and then group by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34747112/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com