如何使用NHibernate中的QueryOver选择根实体和子实体计数?
我有一个非常简单的查询,我正试图转换成NHibernate的QueryOver语法,但我遇到了困难。原始SQL查询的功能与以下相同:如何使用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的
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();