【发布时间】: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();
这会为每个参与者提取最近完成的步骤。但是,我现在需要按此步骤对参与者进行排序。我可以在具体化查询后获取此结果集并对其进行排序,但我正在尝试找到一种方法来在数据库查询本身中完成排序,而无需定义新模型来处理结果。
有没有办法做到这一点?
【问题讨论】:
-
不太明白预期的结果应该是什么。你能提供一些例子吗?例如。如果每两个步骤都有参与者
A和B怎么办。A有步骤2和4和B有步骤有1和3- 例如为什么要把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