Это ошибочное мнение, что кэш первого уровня избегает выполнения sql в целом.
Запросы всегда выполняются в базе данных. Это дает 100% уверенность в том, что результат точно такой же, независимо от того, находятся ли экземпляры в памяти или нет. Это может быть важно, например, при использовании соединений или условий. Нет разницы, если запрос действительно содержит объединения или предложение where.
Кэш первого уровня гарантирует, что возвращается тот же экземпляр, если он представляет один и тот же экземпляр в базе данных. NHibernate выполняет sql, когда он находит в памяти тот же объект, который был возвращен запросом, а затем возвращает объект в кеше. Но он не может знать, прежде чем выполнять sql.
Только когда вы используете session.Get
или session.Load
, NH выполняет поиск в кэше и избегает запроса при обнаружении экземпляра.
AFAIK, Linq для NHibernate ничего не делает с кешем.