ORM (esp. NHibernate) для сложных запросов

Моя компания находится в процессе перезаписи существующего приложения с нуля. Это приложение, среди прочих задач, выполняет сложные SQL-запросы с данными заказа и счета для создания отчетов о продажах. Запросы создаются динамически в зависимости от того, какие критерии выбраны пользователем, поэтому они могут быть довольно сложными, если выбрано много критериев. В настоящее время производительность достойная, но не большая.

Теперь для новой версии мы хотели бы использовать ORM, возможно, NHibernate, потому что он, по-видимому, единственный, поддерживающий Oracle Lite (приложение использует Oracle или Oracle Lite в зависимости от того, работает ли он в подключенном или отключенном режиме). Но я беспокоюсь о производительности запросов, созданных NHibernate. Я работал с другими ORM до (Linq to SQL, Entity Framework), но запросы были довольно простыми, поэтому проблем с производительностью не было.

Итак, прежде чем принять решение об использовании ORM или остаться с простым SQL, я хотел бы знать, насколько хорошо эти инструменты обрабатывают сценарии, такие как внешние соединения, подзапросы и т.д. Как вы думаете, ORM (особенно NHibernate) подходит для использования в описанном выше сценарии отчетности? Должен ли я беспокоиться о производительности для сложных запросов?

Любая обратная связь будет с благодарностью

Ответ 1

Смотрите этот график. На данный момент DataObjects.Net отсутствует, но его результаты по сравнению с EF и NHibernate показаны здесь здесь.

Код проверки LINQ для EF здесь; версии для других инструментов можно найти в одной папке. Все эти файлы .cs генерируются одним шаблоном T4, поэтому тесты полностью идентичны. Используемая модель - это Northwind.

Несколько ссылок:

Ответ 2

NHibernate имеет немного кривой обучения, но это стоит того, чтобы учиться, поскольку любое потраченное время будет многократно окупиться. Я бы порекомендовал NHibernate в книге действий для обучения, поскольку это отличный ресурс и охватывает все ваши вопросы и многое другое.

Производительность NHibernate может быть настроена (см. ссылки ниже), а NHibernate имеет надежный механизм кэширования.

http://www.codeproject.com/KB/database/NHibernate_Perf.aspx https://www.hibernate.org/hib_docs/nhibernate/html/performance.html

В конечном итоге производительность будет определяться тем, кто пишет запросы, как в SQL.

Ответ 3

Если вы ищете ORM с помощью всестороннего и эффективного LINQ-переводчика, я рекомендую вам попробовать Entity Framework или DataObjects.Net. Я не уверен в поддержке Oracle Lite. NHibernate LINQ переводчик еще не завершен.

В любом случае самое лучшее, что вы можете сделать сейчас, это загрузить ведущие инструменты ORM и протестировать их по сложным запросам с группировкой, объединением, подзапросами и т.д.