J'ai une entité qui ressemble à ceci:Comment faire un OfType <>(). Count() sur une collection hétérogène dans NHibernate?
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>(); }
}
}
Où Media
est la classe de base abstraite et Picture
, Video
et Audio
sont les sous-types de Media
, de sorte que la collection IEnumerable<Media>
est hétérogène.
J'ai un DTO pour Album
qui ressemble à ceci:
public class AlbumDTO
{
public string Name { get; set; }
public int PictureCount { get; set; }
public int VideoCount { get; set; }
public int AudioCount { get; set; }
}
Si chaque chef d'accusation est rempli en faisant <collection>.Count();
. Bien que ce code fonctionne très bien et je reçois le compte pour chaque type de support, le SQL généré est moins qu'idéal:
SELECT * FROM Media WHERE media.Album_id = 1
SELECT * FROM Media WHERE media.Album_id = 2
SELECT * FROM Media where media.Album_id = 3
En d'autres termes, il est saisissant tous les Media
d'abord de la base de données, puis effectuer la OfType<T>.Count()
suite en mémoire. Le problème est, si je fais cela sur tous les Albums
, il va sélectionner tous les Media
de la base de données, ce qui pourrait potentiellement être des milliers d'enregistrements. De préférence, je voudrais voir quelque chose comme ça (j'utilise une table par hiérarchie mapping):
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'
Est-ce que quelqu'un sait comment je peux configurer NHibernate pour ce faire? Ou devrais-je modifier mon entité Album
afin d'obtenir le comportement correct?
publiez votre config. Tu utilises Fluent Nhibernate? – Aliostad
J'utilise Fluent NHibernate avec automapping. C'est juste en utilisant les conventions par défaut. –