У меня есть такой запрос для типа 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;
}
Рассмотрите возможность обновления до EF Core 2.1, который включает улучшения LINQ GroupПо переводу.
Я знаю про EF Core 2.1 и улучшения, но сейчас его невозможно обновить. Теперь он не работает должным образом в памяти.
Да, я понял. Но улучшения в EF Core обычно означают исправление ошибок / неправильного поведения. Возможно, ваш запрос попадает в один из них, поскольку я не вижу ничего плохого в построении вашего запроса (например, нет Func<..>
). Если вы ищете обходные пути, попробуйте удалить OrderBy
или попробуйте выполнить всю группировку в памяти явно (переключитесь на LINQ to Objects до GroupBy
- вам потребуется заблокировать GetHashCode
/ Equals
для TheEntityGroupByData
.
Решено. Оказалось, что TheEntityGroupByData должна быть структурирована вместо класса. Подробнее здесь stackoverflow.com/questions/847066/group-by-multiple-columns
Что означает «не сгруппировано, как ожидалось»? Мы не вы и не можем видеть ваши результаты или, возможно, знать, что вы имеете в виду. Включите их, пожалуйста.