我有一個看起來像這樣的實體:如何在NHibernate中對異構集合執行OfType <>()。Count()?
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>
集合是異質的。
我有一個Album
DTO,看起來像這樣:
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
,這可能會有數千條記錄。最好,我希望看到這樣的事情(我使用的table-per-層次映射):
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
實體以獲得正確的行爲?
發佈您的配置。你用Fluent Nhibernate? – Aliostad 2010-12-07 20:01:08