У меня довольно простой запрос, который я пытаюсь преобразовать в синтаксис QueryOver от NHibernate, но у меня возникают трудности. Оригинальный SQL-запрос функционально такой же, как:Как выбрать корневой объект и число дочерних объектов, используя QueryOver в NHibernate?
SELECT [Post].*, (
SELECT Count(*)
FROM [Comment]
WHERE [Comment].[PostId] = [Post].[Id]) AS [CommentCount]
FROM [Post]
Проблема заключается в том, что я с трудом превращаю- синтаксису QueryOver. Я попытался определение сводного класса, содержащий как сообщение и 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, которые я хочу, но беспокоюсь, что я потеряю возможность использовать подклассы proxy, которые NHibernate генерирует для целей ленивой загрузки, и это не то, что я хочу.
К сожалению, я не знаю, есть ли способ, чтобы выбрать из объекта * и * другое свойство –
я думаю, появляется сообщение об ошибке из-за это заявление: ' .Where (() => lCommentAlias.Post.Id == lPostAlias.Id) '. Сначала вам нужно присоединиться к сущности 'Post'. Другой вопрос: вам нужны оба счета? Возможно, было бы легче понять, когда вы предоставляете свои (упрощенные) бизнес-классы. – core
Сегодня я столкнулся с проблемой, пытаясь ответить на этот вопрос http://stackoverflow.com/q/18871722/1236044 Насколько я знаю, (x => x) не будет работать. В любом случае, вот ответ, который, как представляется, решает проблему с некоторой эффективностью. Http://stackoverflow.com/a/17663212/1236044 – jbl