2011-11-30 68 views
0

我有一个Album实体,其中有IList<Photo>。我想用一个快速查询使用NHibernate来选择我的所有相册和照片数量。迁移到NH之前,我不得不使用索引视图的查询:Nhibernate和索引视图

SELECT a.*, t.PhotoCount 
FROM dbo.Album a 
LEFT JOIN dbo.vw_AlbumPhotoCount t ON t.AlbumID = a.AlbumID 

我如何使用NHibernate的这一观点(vw_AlbumPhotoCount),以加快查询?

UPDATE: 我映射了一个简单的<one-to-one/>实体亚历克斯建议,它为我工作。这个解决方案的一个缺点 - 作为one-to-one属性不能加载懒惰我总是得到LEFT JOIN时通过id提取相册。我无法将此实体映射为<many-to-one/>属性,我不确定为什么可能因为该视图没有自己的ID属性。反正ofter它映射为<many-to-one/>我取出一张专辑

更新2之后得到了在它空: 我查看了我的架构,并决定删除该视图。在这种特殊情况下,最好的办法是使用NH缓存系统,而不是索引视图

+0

你最好的选择可能是将一个简单的实体映射到你的PhotoCount视图,然后建立一个这样的关系。只要确保你不要缓存这些对象。 – AlexCuse

+0

感谢您的回复。如果您将其作为答案发布,我会将其标记为解决方案 – Vladimir

回答

0

你最好的选择可能是一个简单的实体映射到您的PHOTOCOUNT看法,然后通过普通的方式与该实体建立关系。只要确保不要缓存这些对象,因为它们永远不会实际更新。

0

在专辑中一物业用公式

// Fluent Mapping 
Map(x => x.PhotoCount).Formula("SELECT t.PhotoCount FROM dbo.vw_AlbumPhotoCount t ON t.AlbumID = AlbumID"); 

// xml mapping 
<property name="PhotoCount" formula="SELECT t.PhotoCount FROM dbo.vw_AlbumPhotoCount t ON t.AlbumID = AlbumID"> 

var albums = session.QueryOver<Album>().List(); 
+0

感谢您的回复,但选择相册列表怎么办? – Vladimir