【发布时间】:2013-09-18 13:09:14
【问题描述】:
我有一个非常简单的查询,我正在尝试将其转换为 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 为延迟加载目的而生成的代理子类的能力,这不是我想要的。
【问题讨论】:
-
不幸的是,我不知道是否有办法选择实体和另一个属性
-
我认为错误信息的出现是因为这个语句:
.Where(() => lCommentAlias.Post.Id == lPostAlias.Id)。您需要先加入Post实体。另一个问题:你需要两个计数吗?当您提供(简化的)业务课程时,也许会更容易理解。 -
我今天在回答这个问题时遇到了问题stackoverflow.com/q/18871722/1236044据我所知,(x=>x) 不起作用。无论如何,这是一个似乎以某种效率解决问题的答案stackoverflow.com/a/17663212/1236044
-
@Rico 只要您引用实体的主键,就不需要加入。数据库中的 Comment 表有一个不需要连接即可访问的 PostId 列。我一直这样做没有错误。
-
@jbl 您发布的答案中的查询看起来会出现 N+1 Select 问题,因为它为查询执行单个 Select,然后为查询执行另一个 Select(通过
Get)原始查询中的每个MediaFile。不过,公平地说,我还没有运行查询来确定这是否属实。
标签: nhibernate queryover