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

标签 c# linq nhibernate linq-to-nhibernate

所以我有一个像 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/

相关文章:

c# - AcceptButton不会关闭表单

c# - Visual Studio 调试器巫术

c# - IStatelessSession 多对一插入对象

c# - 是否有一种流畅的 NHibernate 方法可以索引所有外键而无需编码?

c# - 如何在应用程序设置中存储对象列表

C# 使用相对路径检查文件是否存在

.net - 无需使用多个 IFS 即可搜索我的网站

c# - 单独收集 2 个不同的新系列

c# - 具有格式/文化的表达式树 ToString

c# - 操作方法 : Mapping (NHibernate) multiple classes with different business logic from the same table?