Вычисляемый столбец NHibernate

У меня есть объект («A»), который я сохраняю через NHibernate. У этой сущности может быть несколько дочерних элементов типа («B») в базе данных, и когда я извлекаю сущность A, я хочу иметь свойство, указывающее количество сущностей B, принадлежащих A. Я не хочу использовать здесь, потому что мне не нужно извлекать все объекты B только для их подсчета.

Psuedo SQL может выглядеть так:

select a.*, count(b.*) from a left join b on b.aid = a.id

Возможно ли это с помощью NHibernate и, в частности, поставщика LINQ?


person Chris    schedule 07.04.2011    source источник
comment
Дубликат: stackoverflow.com/questions/3062850   -  person brainimus    schedule 07.04.2011
comment


Ответы (3)


Если вы укажете в своей коллекции lazy="extra", при доступе к свойству count в коллекции nhibernate будет просто получать количество дочерних элементов, а не всех дочерних элементов.

См. Здесь (2-й заголовок): http://blog.idm.fr/2010/02/improving-performance-with-nhibernate.html

person Vadim    schedule 07.04.2011

Можете ли вы вместо этого привязать свой nHibernate к представлению?

CREATE VIEW A_augmented
AS
SELECT A.*
       ,(SELECT COUNT(*) FROM B WHERE B.aid = a.id) AS ChildCount
FROM A

(Я знаю, что этот SQL относительно наивен, но это примерно такой же простой способ выразить его в правильном SQL)

person Cade Roux    schedule 07.04.2011

Вы можете использовать Formula для сопоставления свойства с выражением SQL. Существует пример самого проблема на сайте Ayendes. Приятно использовать, но могут иметь побочные эффекты, которых вам стоит опасаться. Расчетный столбец, конечно, не актуален. Это моментальный снимок, когда объект загружен.

Вы также можете использовать HQL, чтобы получить размер с помощью простого синтаксиса:

select a, size(a.Children)
from a

Конечно, это также возвращает снимок, но ваша бизнес-логика знает об этом, и поэтому это не побочный эффект.

person Stefan Steinegger    schedule 07.04.2011