如何在 NHibernate 中使用 QueryOver 选择根实体和子实体计数



我有一个非常简单的查询,我正在尝试转换为NHibernate的QueryOver语法,但我遇到了困难。原始 SQL 查询在功能上与以下内容相同:

SELECT [Post].*, (
    SELECT Count(*)
    FROM [Comment]
    WHERE [Comment].[PostId] = [Post].[Id]) AS [CommentCount]
FROM [Post]

问题是我很难将其转换为 QueryOver 语法。我尝试定义一个包含 Post 和 CommandCount 的摘要类:

public class PostSummary
{
    public Post Post { get; set; }
    public CommentCount { get; set; }
}

然后使用几个选择定义查询:

Post lPostAlias = null;
Comment lCommentAlias = null;
var lCommentSubquery = QueryOver.Of(() => lCommentAlias)
    .Where(() => lCommentAlias.Post.Id == lPostAlias.Id)
    .ToRowCountQuery();
PostSummary lPostSummaryAlias = null;
session.QueryOver(() => lPostAlias)
    .SelectList(list => list
        .Select(x => x).WithAlias(() => lSummary.Post)
        .SelectSubQuery(lCommentSubQuery).WithAlias(() => lSummary.CommentCount)
    .List<PostSummary>();

引发异常并显示错误消息:

could not resolve property:  of: Project.Models.Post

所以看起来它不喜欢查询的.Select(x => x)部分。我希望找到类似"Projections.RootEntity()"的东西,但唉,我找不到这样的东西。

有人可以解释我做错了什么并指导我正确执行此基本查询的方法吗?我想我可以选择我想要的 Post 的所有属性,但担心我会失去利用 NHibernate 为延迟加载目的生成的代理子类的能力,这不是我想要的。

使用 LINQ 提供程序可以编写

var query = from post in session.Query<Post>()
            select new PostSummary { Post = post, CommentCount = post.Comments.Count };
return query.ToList();