У меня есть объект, который выглядит следующим образом:
public class Album
{
public virtual string Name { get; set; }
public virtual IEnumerable<Media> { get; set; }
public virtual IEnumerable<Picture>
{
get { return Media.OfType<Picture>(); }
}
public virtual IEnumerable<Video>
{
get { return Media.OfType<Video>(); }
}
public virtual IEnumerable<Audio>
{
get { return Media.OfType<Audio>(); }
}
}
Где Media
- абстрактный базовый класс, а Picture
, Video
и Audio
- это подтипы Media
, поэтому коллекция IEnumerable<Media>
является гетерогенной.
У меня есть DTO для Album
, которое выглядит так:
public class AlbumDTO
{
public string Name { get; set; }
public int PictureCount { get; set; }
public int VideoCount { get; set; }
public int AudioCount { get; set; }
}
Где каждый счет заполняется с помощью <collection>.Count();
. Хотя этот код работает нормально, и я получаю счетчик для каждого типа носителя, сгенерированный SQL не идеален:
SELECT * FROM Media WHERE media.Album_id = 1
SELECT * FROM Media WHERE media.Album_id = 2
SELECT * FROM Media where media.Album_id = 3
Другими словами, он сначала захватывает все Media
из базы данных, а затем выполняет OfType<T>.Count()
в памяти. Проблема в том, что если я делаю это для всех Albums
, он выберет все Media
из базы данных, которые потенциально могут быть тысячами записей. Предпочтительно, я хотел бы видеть что-то вроде этого (я использую отображение таблицы на иерархию):
SELECT COUNT(*) FROM Media WHERE media.Album_id = 1 AND discriminator = 'Picture'
SELECT COUNT(*) FROM Media WHERE media.Album_id = 1 AND discriminator = 'Video'
SELECT COUNT(*) FROM Media WHERE media.Album_id = 1 AND discriminator = 'Note'
Кто-нибудь знает, как я могу настроить NHibernate для этого? Или мне придется изменить свою сущность Album
, чтобы получить правильное поведение?