Выбор последних заказов для каждого пользователя с использованием Npg sql и EF Core 3.1 - PullRequest
1 голос
/ 12 апреля 2020

У меня есть сущность Order с двумя основными столбцами с именами UserId и CreationTimeUtc. Я пытаюсь выбрать последний Order для каждого пользователя (конечно, на основе столбца UserId). Обычно я ожидаю сделать это путем группировки и упорядочения. Вот что я попробовал:

var q = _context.Orders.AsNoTracking()
    .Where(t => t.CreationTimeUtc > SomeDate)
    .GroupBy(t => t.UserId)
    .Select(g => g.OrderBy(t => t.CreationTimeUtc).First())
    .Skip(10)
    .Take(10)
    .ToList();

Но выполнение запроса вызывает эту ошибку:

System.InvalidOperationException: выражение LINQ '(GroupByShaperExpression: KeySelector: (r. UserId), ElementSelector: (EntityShaperExpression: EntityType: Order ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False)

Я много гуглил и, похоже, EF Core не поддерживает группировку! Это правда? И если да, то как я могу решить эту проблему? Нужно ли загружать все строки в память или есть какой-нибудь способ на основе LINQ? Есть идеи? Заранее спасибо.

Я использую EF Core 3.1, ASP.NET Core 3.1, Npgsql 3.1, PostgreSQL 12 и C# 8.

1 Ответ

0 голосов
/ 12 апреля 2020

Вы можете сделать это с помощью следующего:

var result = ctx.Users
    .Select(u => u.Orders
        .Where(t => t.CreationTimeUtc > someDate)
        .OrderBy(t => t.CreationTimeUtc)
        .First())
    .ToList();

Это немного другой способ express, почти то же самое. Я свяжусь с соответствующим человеком, чтобы узнать о переводе вашего шаблона c.

...