NHibernate левый выбор соединения в отношении один ко многим - PullRequest
2 голосов
/ 28 января 2011

Я искал неделю после правильного синтакса без успеха.

У меня есть 2 класса:

public class ArtworkData
{
      public virtual Guid Id { get; set; }
      public virtual string Name { get; set; }    
      public virtual IList<CommentData> Comments { get; set; }
}
public class CommentData
{
      public virtual Guid Id { get; set; }
      public virtual string Text { get; set; }
      public virtual ProfileData Profile { get; set; }
      public virtual ArtworkData Artwork { get; set; }
      public virtual DateTime Created { get; set; }
}

Я хочу сделать этот запрос:

    SELECT   this_.ArtworkId          as ArtworkId3_3_,
         this_.Name               as Name3_3_,
         this_.Description        as Descript3_3_3_,
    FROM     Artwork this_
         LEFT outer JOIN 
   (SELECT c.ArtworkIdFk, count(1) Cnt
   FROM Comment c
   GROUP BY c.ArtworkIdFk) as com
   on com.ArtworkIdFk = this_.ArtworkId
    ORDER BY 1 desc

Но я не нахожу пути к.На данный момент у меня просто что-то вроде этого:

ICriteria c = this.Session.CreateCriteria(typeof(ArtworkData));
if(filter.Category !=null)
{
      c.CreateAlias("Categories", "cat")
       .Add(Restrictions.Eq("cat.Id", filter.Category.Id));
}
DetachedCriteria crit = DetachedCriteria.For(typeof(CommentData), "comment")
                    .SetProjection(Projections.ProjectionList()
                    .Add(Projections.Count("comment.Id").As("cnt"))    
                .Add(Projections.GroupProperty("comment.Artwork.Id")));                    



c.Add(Expression.Gt(Projections.SubQuery(crit), 0));
   c.AddOrder(Order.Desc(Projections.SubQuery(crit)));

Но это не то, что я хочу.Я хочу получить все заказы Artworks по количеству комментариев (но мне не нужно получать этот номер).Пожалуйста, помогите мне!Я схожу с ума!

Ответы [ 3 ]

1 голос
/ 31 января 2011

Если вы используете NHibernate 3, вы можете использовать этот код:

var artworks = Session.Query<Artwork>().OrderBy(a => Comments.Count);

Или вы можете использовать HQL:

Session.CreateQuery("from Artwork a order by size(a.Comments)")
1 голос
/ 31 января 2011

Попробуйте Отдельные критерии .Взгляните на этот блог пост .

1 голос
/ 31 января 2011

Я не понимаю, что вы пытаетесь сделать с этим странным SQL, но если вам нужно получить все произведения с количеством комментариев, вы можете попробовать этот запрос:

<query name="ArtworkWithCommentsCount">
   SELECT artwork.Name, artwork.Comments.size
   FROM Artwork artwork
</query>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...