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
коллекция считывается из базы данных.