3

我有一个非常简单的查询,我正在尝试转换为 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 为延迟加载目的而生成的代理子类的能力,这不是我想要的。

4

1 回答 1

1

使用 LINQ 提供程序,您可以编写

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

return query.ToList();
于 2013-09-24T12:16:19.440 回答