Как идентифицировать дубликаты в EF Core 3.1 - PullRequest
1 голос
/ 14 апреля 2020

Проблема заключается в следующем:

Я обновил проект до EF Core 3.1 Мой код для отображения дублированных адресов электронной почты в базе данных компаний перестал работать. Этот код больше не работает после обновления:

cos = cos.Where(x => !string.IsNullOrEmpty(x.Email)).GroupBy(c => c.Email).Where(c => c.Count() > 1).SelectMany(grp => grp);

return View(await cos.ToListAsync());

Я думаю, что это проблема:

До EF Core 3.0 это было сделано неявно, поэтому EF загрузил все строки результатов и затем применил LINQ GroupBy. Однако это неявное поведение может позволить программисту ожидать, что весь запрос LINQ будет выполнен в SQL, что может привести к огромному влиянию на производительность, когда набор результатов достаточно велик. По этой причине неявная оценка на стороне клиента GroupBy была полностью отключена в EF Core 3.0.

Знаете ли вы, как изменить код для работы с EF Core 3.1? Спасибо за вашу помощь.

1 Ответ

1 голос
/ 14 апреля 2020

Вы можете заменить группу -> count -> операции запроса разгруппировки

.GroupBy(c => c.Email).Where(c => c.Count() > 1).SelectMany(grp => grp)

, которые не могут быть переведены в SQL в настоящее время (а также не имеют хорошего потенциала SQL перевода в будущем) с самостоятельным подзапросом, считающим совпадения «ключа», например

.Where(c => cos.Count(c1 => c1.Email == c.Email) > 1)
...