Сложный выбор из БД с помощью EF Core без реализации запросаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Сложный выбор из БД с помощью EF Core без реализации запроса

Сообщение Anonymous »

Похоже, мне нужна помощь гуру EF. Итак, в моем проекте есть БД Postgres с EF Core. Существует таблица RequestDbModel, которая может содержать множество строк с одинаковым идентификатором и разными TS. Мне нужно выбрать коллекцию запросов из этой таблицы, где элементы представляют собой строки с одинаковым идентификатором, а также необходимо заполнить некоторые дополнительные поля из этих элементов, упорядоченных по ts. Я могу это сделать, но только если я материализую запрос. Я считаю, что это можно сделать без материализации, но я не могу понять, как, и буду признателен за любую помощь.
  • 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
// builder.HasKey(p => new { p.Id, p.Timestamp })
// .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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как отправить сложный объект с изображениями на сервер .net Core 8 с помощью JavaScript?
    Anonymous » » в форуме C#
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • Как правильно сохранить сложный объект с помощью EF Core
    Anonymous » » в форуме C#
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Entity Framework Core Сложный тип в качестве первичного ключа
    Anonymous » » в форуме C#
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Как передать сложный объект C# с помощью FromQuery
    Anonymous » » в форуме C#
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как обнаружить сложный QR-код с помощью ZXing?
    Anonymous » » в форуме Android
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»