EF Core 3 GroupBy несколько столбцов Количество бросков с расширениями, но linq работает - PullRequest
2 голосов
/ 11 января 2020

Вот то, что выдает полное исключение:

            var duplicateCountOriginal = _db.TableName
                                .GroupBy(g => new {g.ColumnA, g.ColumnB, g.ColumnC})
                                .Count(g => g.Count() > 1);

Исключение: System.ArgumentException: выражение типа 'System.Fun c2[System.Linq.IGrouping 2 [Microsoft.EntityFrameworkCore.Storage.ValueBuffer, Microsoft.EntityFrameworkCore.Storage.ValueBuffer], Microsoft.EntityFrameworkCore.Storage.ValueBuffer] 'нельзя использовать для параметра типа' System.Fun c* 100EEF [1]. Storage.ValueBuffer] Выберите [ValueBuffer, ValueBuffer] (System.Collections.Generi c .IEnumerable 1[Microsoft.EntityFrameworkCore.Storage.ValueBuffer], System.Func 2 [Microsoft.EntityFrameworkCore.Storage.ValueBuffer, Microsoft.EntityFrameworkCore.Storage.ValueBergSerge_Storage.ValueBuffer) (Paragraph)

Но то же самое работает, когда оно написано как linq (я предпочитаю расширения)

            var duplicateCount =
                    from a in _db.TableName
                    group a by new {a.ColumnA, a.ColumnB, a.ColumnC}
                    into g
                    where g.Count() > 1
                          select g.Key;
            duplicateCount.Count()

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

            var duplicateCountOriginal = _db.TableName
                                .GroupBy(g => new {g.ColumnA, g.ColumnB, g.ColumnC})
                                .AsEnumerable()
                                .Count(g => g.Count() > 1);

, я получу следующее исключение : System.InvalidOperationException: проекция клиента содержит ссылка на постоянное выражение «Microsoft.EntityFrameworkCore.Metadata.IPropertyBase», которое передается в качестве аргумента методу «TryReadValue». Это может привести к утечке памяти. Попробуйте назначить эту константу локальной переменной и использовать переменную в запросе. См. https://go.microsoft.com/fwlink/?linkid=2103067 для получения дополнительной информации.

По моему мнению, ссылка, указанная ms, не имеет никакого значения для любой проблемы здесь.

Пожалуйста, LMK если есть какое-либо логическое объяснение.

1 Ответ

5 голосов
/ 11 января 2020

Нет логического объяснения. Просто EF Core трансляция запросов все еще далека от совершенства и имеет много дефектов / ошибок / необработанных случаев.

В данном конкретном случае проблема не в синтаксисе запроса или синтаксисе метода (что вы называете расширениями), а в отсутствии Select после GroupBy. Если переписать запрос синтаксиса метода, аналогичный тому, который использует синтаксис запроса, то есть добавить .Where, .Select, а затем Count:

var duplicateCount = _db.TableName
    .GroupBy(g => new {g.ColumnA, g.ColumnB, g.ColumnC})
    .Where(g => g.Count() > 1)
    .Select(g => g.Key)
    .Count();

, тогда он будет переведен и успешно выполнен.

...