- Request.Status — Статус последних (самых новых) элемент в Items
- Request.CreatedTime — TS первого (самого старого) элемента в Items.
- Request.AppliedTime — самые старые TS элемента в Items с Статус == «Утверждено»
- Request.CreatorId — UserId первого (самого старого) элемента в
Items - Request.ApproverId — UserId для самого старого элемента в Items со статусом
Status == "Approved" или null - Request.Comment — комментарий для самого старого
элемента в Items
// .HasName("requests_pkey");
public class RequestDbModel
{
public long Id { get; init; }
public required string Status { get; set; }
public required DateTime Timestamp { get; init; }
public required Guid UserId { get; init; }
public string? Comment { get; init; }
}
public sealed class Request
{
public required long Id { get; init; }
public required string Status { get; init; }
public DateTime CreatedTime { get; init; }
public DateTime? AppliedTime { get; init; }
public required Guid CreatorId { get; init; }
public Guid? ApproverId { get; init; }
public string? Comment { get; init; }
public required RequestItemHistory[] Items { get; init; }
}
public sealed class RequestItemHistory
{
public required string Status { get; init; }
public required DateTime Timestamp { get; init; }
public required Guid UserId { get; init; }
public string? Comment { get; init; }
}
public IQueryable GetRequests()
{
var groups = context.Requests.AsNoTracking()
.GroupBy(r => r.Id)
.Select(g => new
{
Id = g.Key,
Items = g.OrderBy(r => r.Timestamp).Select(r => new RequestItemHistory
{
Status = r.Status,
Timestamp = r.Timestamp,
UserId = r.UserId,
Comment = r.Comment,
})//.ToList()
});
var result = groups
.ToList()
.Select(x => new Request
{
Id = x.Id,
Status = x.Items.Last().Status,
CreatedTime = x.Items.First().Timestamp,
AppliedTime = x.Items.Where(i => i.Status == "Approved").OrderByDescending(i => i.Timestamp).Select(i => (DateTime?)i.Timestamp).FirstOrDefault(),
CreatorId = x.Items.First().User,
ApproverId = x.Items.Where(i => i.Status == "Approved").OrderByDescending(i => i.Timestamp).Select(i => i.User).FirstOrDefault(),
Comment = x.Items.Last().Comment,
Items = x.Items.ToArray()
}).AsQueryable();
return result;
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... -the-query