NHibernate вычисляемый столбец - PullRequest
3 голосов
/ 07 апреля 2011

У меня есть сущность ("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?

Ответы [ 3 ]

3 голосов
/ 08 апреля 2011

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

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

1 голос
/ 07 апреля 2011

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

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

select a, size(a.Children)
from a

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

1 голос
/ 07 апреля 2011

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

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

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

...