所以我有一个像 this 这样的查询:
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:从作用域“引用”类型“Album”的变量“x”,但未定义
将.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
世界,并将被转换为投影
如果我们想要获取专辑
列表,我们甚至需要 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>())
关于c# - 从 NHibernate 子查询中仅选择某些属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29649261/