Так что же лучше для производительности и удобства сопровождения кода, который выполняет эти группировки и вычисления с помощью sql-запроса (pl / sql) или через linq?
Это зависит от того, что вы подразумеваете подvia linq
.Если вы имеете в виду, что извлекаете полную таблицу из локальной памяти, а затем используете операторы linq для извлечения желаемого результата, тогда, конечно, операторы SQL работают быстрее.
Однако, если вы имеете в виду, что используете Entity Framework,или что-то подобное, тогда ответ дать непросто.
Если вы используете Entity Framework (или какой-то клон), ваши таблицы будут представлены IQueryable<...>
вместо IEnumerable<...>
.IQueryable
имеет Expression
и Provider
.Expression
представляет запрос, который должен быть выполнен.Provider
знает, какая система должна выполнить запрос (обычно это система управления базами данных) и как связаться с этой системой.Когда запрос должен быть выполнен, задача Provider
состоит в том, чтобы перевести Expression
на язык, который система знает (обычно что-то похожее на SQL), и выполнить SQL-запрос.
Существует два вида операторов LINQ IQueryable: те, которые возвращают IQueryable<...>
чего-либо, и те, которые возвращают TResult
.Те, которые возвращают IQueryable
, изменяют только Expression
.Это функции, которые используют отложенное выполнение.
Функции, которые не возвращают IQueryable
, ToList()
, FirstOrDefault()
, Any()
, Max()
и т. Д. Внутренне они будут вызывать функции, которые будутGetEnumerator()
(обычно через foreach), который приказывает Provider
перевести Expression
и выполнить запрос.
Вернуться к вашему вопросу
Итаккакой из них более эффективен, объектный каркас или SQL?Эффективность - это не только время выполнения запросов, это также время разработки / тестирования для первой версии и будущих изменений в программном обеспечении.
Если вы используете Entity-Framework (-clone),SQL-запросы, созданные из Expressions
, довольно эффективны, в зависимости от производителя платформы.Если вы посмотрите на код, то иногда SQL-запрос не является оптимальным, хотя для улучшения большинства запросов вам придется быть довольно хорошим SQL-программистом.
Большое преимущество над использованием Entity Framework иLINQ-запросы над SQL-операторами состоят в том, что время разработки будет короче.Синтаксис операторов LINQ проверяется во время компиляции, а операторы SQL - во время выполнения.Сроки разработки и тестирования будут короче.
Легко использовать операторы LINQ, в то время как операторы SQL почти всегда должны быть написаны специально для запроса, который вы хотите выполнить.Операторы LINQ можно тестировать без базы данных на любой последовательности элементов, представляющих ваши таблицы.
My Advice
Для большинства запросов вы не заметите никакой разницы в выполнениивремя между запросом структуры объекта или запросом SQL.
Если вы ожидаете сложных запросов и будущих изменений, я бы пошел на сущности.С основным аргументом - более короткое время разработки, лучшие возможности тестирования и лучшая обслуживаемость.
Если вы обнаружите некоторые запросы, в которых вы заметите, что время выполнения слишком велико, вы всегда можете решить обойти инфраструктуру сущностей, выполнивSQL-запрос вместо использования LINQ.
Если вы поместили DbContext
в надлежащий репозиторий, где вы скрываете варианты использования от их реализаций, пользователи вашего репозитория не заметят разницы.