Linq2Sql больше не разрабатывается. Они, вероятно, никогда не избавятся от этого, но они больше к этому не прибавляют; устарела в пользу MSEF.
NHibernate, вероятно, так же эффективен, как и любой ORM. Имейте в виду, что большинство ORM используют много рефлексии для создания объектов, получения и установки свойств, переваривания выражений Linq и т. Д. Вы не отойдете от этого без возврата к ADO.NET.
Тем не менее, NHibernate имеет значительную проблему "N + 1" с прокси-сервером PersistentBag. Когда сущность, которая содержит коллекцию дочерних сущностей, создается экземпляром NH из данных, ее дочерняя коллекция устанавливается на прокси-объект, который фактически не содержит данные; он просто знает, как сделать больше звонков, чтобы получить эти данные. Когда вы запрашиваете каждый элемент дочерней коллекции, NHibernate делает еще один вызов БД. Это приводит к общему количеству циклических обращений "N + 1" в БД, где, если вы сами спроектировали свой DAL, вы, вероятно, обрабатываете тот же случай в 2 циклических обходах; один для основного объекта и один для дочерней коллекции.
Если вы понимаете эту проблему, вы можете обойти ее, кодируя второй запрос для дочерних элементов вместо того, чтобы NHibernate инициализировал их для вас. Вы все еще можете заставить его работать лениво.