NHibernate Lazy = "Extra"

Есть ли хорошее объяснение, на что способен lazy = "extra"?

Все сообщения, которые я видел, просто повторяют тот факт, что он обращает ссылки на MyObject.ItsCollection.Count на запросы count (*) (при условии, что они уже не загружены).

Я хотел бы знать, способен ли он к более надежным вещам, например, превратить MyObject.ItsCollection.Any(o => o.Whatever == 5) в запрос SELECT ...EXISTS.

Раздел 18.1 docs касается только этого. Я не разработчик NH, поэтому я не могу экспериментировать с ним и наблюдать за SQL Profiler, не выполняя некоторую работу, все настраивая; Я просто ищу какую-то ссылку, описывающую, на что способна эта функция.

Спасибо!

Ответ 1

для версии 2.x используется только для перевода collection.Count() в select count, и, насколько я могу видеть в источнике, он также позволяет конструкту collection[5] извлекать эту конкретную сущность (с индекс 5) вместо увлажнения всей коллекции.

Для версии 3.x я ничего не видел в примечаниях к выпуску

Ответ 2

Просто попробовал вызов Any() в коллекции Customer.Orders с lazy = "extra"

customer.Orders.Any()

и полученный SQL-запрос выглядел примерно так: (/)

SELECT *
FROM Order
WHERE CustomerId = 120

Если при вызове

customer.Orders.Count > 0

полученный SQL выглядел следующим образом:

SELECT count(*)
FROM Order
WHERE CustomerId = 120

Ответ 3

Lazy = extra позволяет подсчитать элемент коллекции без необходимости его извлечения, поскольку ленивый объект украшен прокси-сервером, когда код клиента запрашивает .Count в коллекции, правильный "select count" выдается в базу данных. Без lazy=extra коллекция считывается из базы данных.