Вот то, что выдает полное исключение:
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 если есть какое-либо логическое объяснение.