rich.okelly и Ladislav Mrnka по-разному правы.
Оба их ответа касаются того факта, что методы IEqualityComparer<T>
не будут переведены в SQL.
Я думаю, что стоит взглянуть на плюсы и минусы каждого, что займет немного больше, чем комментарий.
Подход rich переписывает запрос в другой запрос с тем же конечным результатом.Их код должен привести к более или менее эффективному выполнению этого действия с SQL-кодом, написанным вручную.
Ладислав вытаскивает его из базы данных в точке, предшествующей отдельному, и тогда будет работать подход в памяти.
Поскольку база данных отлично справляется с определенными задачами группировки и фильтрации, она, вероятно, будет наиболее производительной в этом случае.Тем не менее, вы можете обнаружить, что сложность того, что происходит до этой группировки, такова, что Linq-to-entity не генерирует ни одного отдельного запроса, а генерирует несколько запросов, а затем выполняет некоторую работу в памяти, котораяможет быть довольно неприятным.
Как правило, группировка обходится дороже, чем в случае с оперативной памятью (особенно если вы вносите ее в память с помощью AsList()
, а не AsEnumerable()
).Так что, если вы уже собирались внести это в память на этом этапе из-за какого-то другого требования, это было бы более производительным.
Это также был бы единственный выбор, если бы ваше определение равенства было чем-то, что нехорошо соотносятся с тем, что доступно только в базе данных, и, конечно, это позволяет вам переключать определения равенства, если вы хотите сделать это, основываясь на IEqualityComparer<T>
, передаваемом в качестве параметра.
Вообще, rich этоЯ бы сказал, что ответ, скорее всего, будет лучшим выбором здесь, но различные плюсы и минусы Ладислава по сравнению с богатыми делают его также достойным изучения и рассмотрения.