3

2つの簡単なクラスがあります

public class Blog
{
  public Blog(){
    Comments=new List<Comment>();
  }
  public virtual Guid Id { get; set; }
  public virtual string Title { get; set; }
  public virtual string Text { get; set; }
  public virtual DateTime CreatedDate { get; set; }
  public virtual IList<Comment> Comments { get; set; }
}

public class Comment
{
  public virtual Guid Id { get; set; }
  public virtual string Author { get; set; }
  public virtual string Text { get; set; }
}

AutoMapを使用してマッピングされ、すべてが世界に最適です。エンティティを追加して保存しても問題ありません。

私がやりたいのは、QueryOverを使用してブログごとのコメント数を取得することですが、コメントがないブログを含めるので、SQLでは次のようになります。

SELECT b.Title,COUNT(c.ID) AS Comments
FROM Blogs b LEFT JOIN Comments c ON b.ID=c.BlogID

取得します

タイトルコメント
ブログ10
ブログ20
ブログ30
ブログ44
ブログ50

私が持っている最も近いものは

var results=session.QueryOver<Blog>()
.Left.JoinQueryOver<Comment>(b=>b.Comments)
.TransformUsing(new DistinctRootEntityResultTransformer())
.List<Blog>()
.Select(b => new {
Id = b.Id,
Title = b.Title,
Comments=b.Comments.Count
});

これは正しい答えを取得しますが、SQLは次のように実行されます

SELECT b.Id,b.Title,c.ID,c.Author,etc... AS Comments
FROM Blogs b LEFT JOIN Comments c ON b.ID=c.BlogID

次に、クライアント側でカウントを実行しますが、これは最も効率的な方法ではないようです。

これはQueryOverまたはICriteriaで実行できますか?可能であれば、hqlは使用したくありません。

すべての構成などを確認したい場合は、ソリューション全体がhttps://github.com/oharab/NHibernateQueriesSpikeで入手できます。

乾杯

B。

4

1 に答える 1

1

質問を投稿した直後にいつも答えが見つかるのはなぜですか?

答えは、エイリアスプレースホルダーを使用したJoinAliasメソッドでした。

Comment comment=null;
var results=session.QueryOver<Blog>()
    .Left.JoinAlias(b=>b.Comments,()=>comment)
    .SelectList(
        list=>list
        .SelectGroup(b=>b.Id)
        .SelectGroup(b=>b.Title)
        .SelectCount(b=>comment.Id)
    )
    .List<object[]>()
    .Select(b => new {
                Id = (Guid)b[0],
                Title = (string)b[1],
                Comments=(int)b[2]
               });

これは、私が期待したとおりに機能します。

B。

于 2012-08-29T12:44:06.977 に答える