我有一个非常简单的查询,我正在尝试转换为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();