одним из полей является count (*) NHibernate - PullRequest
3 голосов
/ 13 февраля 2011

Могу ли я сделать сопоставление для запроса следующим образом:

select id,name,address,(select count(*) from account where record_id=id ) as counter
from data where id = :id

В настоящее время я использую собственный SQL.

class person
{
    public virtual long Id{get;set;}
    public virtual string Name{get;set;}
    public virtual string Address{get;set;}
    public virtual long Counter{get;set;}
}

отображение:

<property name="Counter" formula="(select count(*) from account where record_id=id )"      type="long"/>

Ответы [ 2 ]

5 голосов
/ 13 февраля 2011

Да, вы должны использовать формула .

Ваши отображения могут выглядеть следующим образом:

<property name="CountOfAccounts"
    formula="(select count(*) from account where account.id = id)"/>
3 голосов
/ 13 февраля 2011

Это зависит от бизнес-классов, которые вы хотите использовать.Вы могли бы иметь эти классы;

class Person
{
  int Id { get; private set; }
  string Name { get; set; }
  string Address { get; set; }
  IList<Account> Accounts { get; private set; } 
}

class Account
{
  // ...
}

Тогда вы отображаете это "обычно" как один ко многим.Не забудьте использовать ленивую загрузку.Вы можете сделать его двунаправленным.

Вы можете создать оптимизированный запрос, который не позволяет загружать учетные записи только для их подсчета:

select 
  p,
  size(p.Accounts)
from
  Person p
where 
  p.id = :id

Это производит запрос, аналогичный вашему.Вы получаете человека в первом столбце и количество учетных записей во втором.

...