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。