从 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.InvalidOperationException:variable '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>())
所以我有一个查询
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.InvalidOperationException:variable '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>())