从 NHibernate 子查询中仅选择某些属性

Selecting only certain properties from a NHibernate Subquery

所以我有一个查询 :

var sq = QueryOver.Of<Image>()
    .Where(i => i.NumID == ImageID) //The ImageID is for example 1026
    .Select(i => i.Album.Id);       // here we return the Album.ID (column AlbumID)

// just Albums with searched Image
var query = QueryOver.Of<Album>()
    .WithSubquery
    .WhereProperty(a => a.Id)
    .In(sq) 
    .List<Album>();

现在假设我的 专辑 包含一个很大的 属性 我并不总是想加载它,我只想加载专辑 ID 和名称所以我尝试了以下方法:

// just Albums with searched Image
var query = QueryOver.Of<Album>()
    .WithSubquery
    .WhereProperty(a => a.Id)
    .In(sq)
    .Select(x => new{x.Id, x.Name})
    .List<Album>();

但这会生成一个 System.InvalidOperationExceptionvariable 'x' of type 'Album' referenced from scope '', but it is not defined

.Select 放在 .List 之后确实有效,但是 SQL 将加载整张专辑,这正是我要避免的。

重点是使用 NHibernate QueryOver 方法 SelectList,而不是 LINQ Select 方法

// .Select(x => new{x.Id, x.Name})
.SelectList(list => list
    .Select(x => x.Id)
    .Select(x => x.Name)
)

SelectList属于QueryOver世界,会被翻译成投影

如果我们想要获得 Album 的列表,我们甚至需要 trasfromer

Album a = null;

...
.SelectList(list => list
    .Select(x => x.Id).WithAlias(() => a.Id)
    .Select(x => x.Name).WithAlias(() => a.Name)
)
.TransformUsing(NHibernate.Transform.Transformers.AliasToBean<Album>())