【问题标题】:Sort by most recent of nested collection按最近的嵌套集合排序
【发布时间】:2022-01-03 13:01:52
【问题描述】:

我有一个 .NET 6 Entity Framework(使用 Azure SQL)应用程序来管理事件并显示排行榜。它跟踪参与者和必须按顺序完成的操作。事件的步骤在 Steps 类中定义,然后 Action 类记录参与者完成相关步骤。数据模型基本上是:

public class Participant
{
    public Guid Id = { get; set; }
    public string Name = { get; set; }
    public List<Action> Actions = { get; set; } = new();
}

public class Step
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public int Number { get; set; }
}

class Action
{
    public Guid Id { get; set; }
    public Participant Participant { get; set; }
    public Step Step { get; set; }
    public DateTime When { get; set; }
}

我要做的是显示一个包含以下字段的排行榜:

  • 参与者姓名
  • 步骤
  • H:mm 经过

我正在努力将一个排序正确的查询放在一起。我可以轻松做到:

var results = await _context.Participants
    .Include(p => p.Actions.OrderByDescending(a => a.Step.Number).Take(1))
        .ThenInclude(a => a.Step)
    .ToListAsync();

这会为每个参与者提取最近完成的步骤。但是,我现在需要按此步骤对参与者进行排序。我可以在具体化查询后获取此结果集并对其进行排序,但我正在尝试找到一种方法来在数据库查询本身中完成排序,而无需定义新模型来处理结果。

有没有办法做到这一点?

【问题讨论】:

  • 不太明白预期的结果应该是什么。你能提供一些例子吗?例如。如果每两个步骤都有参与者 AB 怎么办。 A 有步骤24B 有步骤有13 - 例如为什么要把B 放在第一位?可能是因为B的最低步低于A的最低步?!? - 那么基本上比较一个参与者与另一个参与者的范围的规则是什么,你想比较最低,最高,平均值,总和,xxx步
  • 我猜你正在寻找First。看这里:dotnetfiddle.net/HbqEa1
  • 我只是假设,这段代码可以被Entity Framework翻译成SQL
  • @RandRandom:一切都必须按顺序进行,应用程序可以防止事情发生乱序。我希望看到如下内容: - 参与者 1,第 5 步,4:13 - 参与者 2,第 5 步,4:15 - 参与者 3,第 4 步,3:50
  • 另外,@RandRandom,我可以使用 .FirstOrDefault() 而不是 .Take(1),但这并不能解决排序问题。

标签: c# entity-framework linq


【解决方案1】:

为了提高性能,最好在客户端进行排序(即在具体化查询之后)。如果您想要服务器端排序,则必须将排序添加到查询表达式:

var results = await _context.Participants

    .OrderBy(p => p.Actions.Select(a => a.Step.Number) // or OrderByDescending
        .OrderByDescending(n => n).FirstOrDefault())

    .Include(p => p.Actions.OrderByDescending(a => a.Step.Number).Take(1))
        .ThenInclude(a => a.Step)
    .ToListAsync();

那是因为Include 只确定加载哪些导航属性而没有其他内容。它从不影响主查询的过滤和排序。

【讨论】:

    猜你喜欢
    • 2021-01-20
    • 2022-01-10
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 2020-09-02
    • 2021-02-24
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多