Группировка по запросу не выполняется должным образом

У меня есть такой запрос для типа TheEntity:

        var source = await _repository.Queryable.AsNoTracking()
            .Where(Condition1())
            .Where(Condition2(params))
            .GroupBy(GroupByFunction)
            .Select(SelectFunction)
            .OrderBy(o => o.Field1)
            .ToAsyncEnumerable().ToList();

Этот запрос выбирает все записи, которые удовлетворяют условиям: Condition1, Condition2, но не группирует их, как я ожидал.

SelectFunction и GroupByFunction выглядят следующим образом:

    private readonly Expression<Func<IGrouping<TheEntityGroupByData, TheEntity>, TheEntitySelectData>> SelectFunction =
        e => new TheEntitySelectData()
        {
            Field1 = e.Key.Field1,
            Field2 = e.Key.Field2,
            ...
            FieldN = e.Key.FieldN,
            Field(N+1) = e.Sum(x=>x.Field(N+1)),
            ...
            FieldK = e.Sum(x=>x.FieldK),
        };

    private readonly Expression<Func<TheEntity, TheEntityGroupByData>> GroupByFunction =
        e => new TheEntityByData()
        {
            Field1 = e.Field1,
            Field2 = e.Field2,
            ...
            FieldN = e.Key.FieldN,
        };

TheEntityGroupByData, TheEntitySelectData являются вспомогательными типами DTO / PO_Os. Я намерен активировать группировку в базе данных, а не на сервере, но это поведение не работает даже в памяти сервера.

Я использую .Net Core 2.0.5 и EntityFrameworkCore 2.0.2.

У меня вопрос: в чем проблема такого подхода?


edit - Я имею в виду, что запрос не работает так, как я ожидал: если у меня будут две одинаковые записи в db (одинаковые по ключу группировки), которые выполняют Condition1 и Condition2, запрос вернет 2 вместо одной записи.


Условия фильтрации выглядят следующим образом:

private static Expression<Func<TheEntity, bool>> Condition1()
{
    return (e) => e.Field1 == SOME_CONSTANT;
}

private static Expression<Func<TheEntity, bool>> Condition2(RequestParam param)
{
    Expression<Func<TheEntity, bool>> whereSth;
    if (param.some.HasValue)
        whereSth = (e) => e.Field2 <= param.some.Value;
    else
        whereSth = (e) => true;
    return whereSth;
}

Что означает «не сгруппировано, как ожидалось»? Мы не вы и не можем видеть ваши результаты или, возможно, знать, что вы имеете в виду. Включите их, пожалуйста.

Kamil Gosciminski 07.08.2018 11:43

Рассмотрите возможность обновления до EF Core 2.1, который включает улучшения LINQ GroupПо переводу.

Ivan Stoev 07.08.2018 11:46

Я знаю про EF Core 2.1 и улучшения, но сейчас его невозможно обновить. Теперь он не работает должным образом в памяти.

lissajous 07.08.2018 11:48

Да, я понял. Но улучшения в EF Core обычно означают исправление ошибок / неправильного поведения. Возможно, ваш запрос попадает в один из них, поскольку я не вижу ничего плохого в построении вашего запроса (например, нет Func<..>). Если вы ищете обходные пути, попробуйте удалить OrderBy или попробуйте выполнить всю группировку в памяти явно (переключитесь на LINQ to Objects до GroupBy - вам потребуется заблокировать GetHashCode / Equals для TheEntityGroupByData.

Ivan Stoev 07.08.2018 11:59

Решено. Оказалось, что TheEntityGroupByData должна быть структурирована вместо класса. Подробнее здесь stackoverflow.com/questions/847066/group-by-multiple-columns

lissajous 07.08.2018 12:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
54
0

Другие вопросы по теме