ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 实体框架:按顺序排序然后分组

2019-05-23 09:05:03  阅读:373  来源: 互联网

标签: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不是唯一的.表中通常会有多个具有相同CorrelationId的记录,该字段用于跟踪哪些日志条目对应于哪个请求.

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

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列以降序返回,以便在UI的表顶部显示新的AuditTrails.

我也试过这个查询(按照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分组时.

解决方法:

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

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,entity-framework-6
来源: https://codeday.me/bug/20190523/1156685.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有