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

如何使用NHibernate中的QueryOver选择根实体和子实体计数?,nhibernate,queryover,Nhibernate,Queryover,我有一个非常简单的查询,我正试图转换成NHibernate的QueryOver语法,但我遇到了困难。原始SQL查询的功能与以下相同: SELECT [Post].*, ( SELECT Count(*) FROM [Comment] WHERE [Comment].[PostId] = [Post].[Id]) AS [CommentCount] FROM [Post] 问题是我很难将其转换为QueryOver语法。我尝试定义一个包含Post和CommandCount的

我有一个非常简单的查询,我正试图转换成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>();
因此它看起来不喜欢查询的
。选择(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();
var query=from post in session.query()
选择new PostSummary{Post=Post,CommentCount=Post.Comments.Count};
返回query.ToList();

不幸的是,我不知道是否有办法选择实体和另一个属性。我认为出现错误消息是因为以下语句:
。其中(()=>lCommentAlias.Post.Id==lPostAlias.Id)
。您需要先加入
Post
实体。另一个问题:你需要两个计数吗?当你提供你的(简化的)业务类时,也许会更容易理解。据我所知,今天我在回答这个问题时遇到了这个问题,(x=>x)不起作用。不管怎么说,这里有一个答案,它似乎以某种效率解决了这个问题@Rico,只要您引用实体的主键,就不需要加入。DB中的Comment表有一个PostId列,不需要连接即可访问。我一直这样做,没有出错。@jbl您发布的答案中的查询看起来会有一个N+1选择问题,因为它对查询进行一次选择,然后对原始查询中的每个
媒体文件进行另一次选择(通过
Get
)。不过,公平地说,我还没有运行查询来确定这是否是真的。
var query = from post in session.Query<Post>()
            select new PostSummary { Post = post, CommentCount = post.Comments.Count };

return query.ToList();