Ich habe ein Unternehmen, das wie folgt aussieht:Wie mache ich einen OfType <>(). Count() auf eine heterogene Sammlung in 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>(); }
}
}
Wo Media
die abstrakte Basisklasse ist und Picture
, Video
und Audio
sind Subtypen von Media
, so dass die IEnumerable<Media>
Sammlung heterogener ist.
Ich habe einen DTO für Album
die wie folgt aussieht:
public class AlbumDTO
{
public string Name { get; set; }
public int PictureCount { get; set; }
public int VideoCount { get; set; }
public int AudioCount { get; set; }
}
Wo jede Zählung indem <collection>.Count();
bevölkert wird. Obwohl dieser Code funktioniert gut und ich die Zählung für jeden Medientyp zu erhalten, ist die erzeugte SQL weniger als ideal:
SELECT * FROM Media WHERE media.Album_id = 1
SELECT * FROM Media WHERE media.Album_id = 2
SELECT * FROM Media where media.Album_id = 3
Mit anderen Worten, alle es greift die Media
zuerst aus der Datenbank und dann die OfType<T>.Count()
danach Durchführung in Erinnerung. Das Problem ist, wenn ich dies über alle Albums
mache, wird es alle Media
aus der Datenbank auswählen, die möglicherweise Tausende von Datensätzen sein könnte. Ich würde Vorzugsweise mag so etwas sehen (ich verwende Tabelle pro Hierarchie 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'
Wer weiß, wie ich NHibernate dies tun konfigurieren können? Oder muss ich meine Album
Entität ändern, um das richtige Verhalten zu erhalten?
veröffentlichen Sie Ihre Konfig. Verwenden Sie Fluent Nhibernate? – Aliostad
Ich verwende Fluent NHibernate mit automapping. Es verwendet nur die Standardkonventionen. –