2013-09-18 6 views
3

У меня довольно простой запрос, который я пытаюсь преобразовать в синтаксис 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 генерирует для целей ленивой загрузки, и это не то, что я хочу.

+0

К сожалению, я не знаю, есть ли способ, чтобы выбрать из объекта * и * другое свойство –

+0

я думаю, появляется сообщение об ошибке из-за это заявление: ' .Where (() => lCommentAlias.Post.Id == lPostAlias.Id) '. Сначала вам нужно присоединиться к сущности 'Post'. Другой вопрос: вам нужны оба счета? Возможно, было бы легче понять, когда вы предоставляете свои (упрощенные) бизнес-классы. – core

+0

Сегодня я столкнулся с проблемой, пытаясь ответить на этот вопрос http://stackoverflow.com/q/18871722/1236044 Насколько я знаю, (x => x) не будет работать. В любом случае, вот ответ, который, как представляется, решает проблему с некоторой эффективностью. Http://stackoverflow.com/a/17663212/1236044 – jbl

ответ

1

с помощью поставщику LINQ вы можете написать

var query = from post in session.Query<Post>() 
      select new PostSummary { Post = post, CommentCount = post.Comments.Count }; 

return query.ToList(); 

 Смежные вопросы

  • Нет связанных вопросов^_^