Как выбрать уникальные значения из IQueryable с помощью LINQ?

Использую EF Core 3.1.13.

Есть таблица БД, в которой есть поле, которое может принимать одинаковые значения. Необходимо вывести только уникальные значения в IQueryable, чтобы отправить их на фронт.

Класс контекста:

public partial class VoterCollectorContext : DbContext
{
    public VoterCollectorContext()
    {
    }

    public VoterCollectorContext(DbContextOptions<VoterCollectorContext> options)
        : base(options)
    {
    }
}

Как я пытаюсь это сделать:

[HttpGet]
public IActionResult Create()
{
    var pollingStation = _context.PollingStation
        .Where(p => p.CityId == 1)
        .GroupBy(p => p.Name).Select(grp => grp.FirstOrDefault())
        .ToList();

    // остальной код опущен за ненадобностью
}

Мне выдает ошибку:

InvalidOperationException: The LINQ expression '(GroupByShaperExpression: KeySelector: (p.Name), ElementSelector:(EntityShaperExpression: EntityType: PollingStation ValueBufferExpression: (ProjectionBindingExpression: EmptyProjectionMember) IsNullable: False ) ) .First()' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().

Как это можно сделать?

Если убрать вот эту часть:

.GroupBy(p => p.Name).Select(grp => grp.FirstOrDefault())

, то все работает норм.


Ответы (1 шт):

Автор решения: Uranus

Если безразлично в каком порядке брать первый элемент из подгруппы, можно взять элемент с наименьшим идентификатором.

var filteredStations = _context.PollingStation
    .Where(p => p.CityId == 1);
var pollingStation = filteredStations
    .Where(p => p.Id == filteredStations.Where(x => x.Name == p.Name).Min(y => y.Id));
→ Ссылка