gpt4 book ai didi

c# - 使用 QueryOver/ICriteria 在 NHibernate 中聚合左连接

转载 作者:行者123 更新时间:2023-11-30 17:58:31 26 4
gpt4 key购买 nike

我有两个简单的类

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 绘制 map ,世界一切美好。我可以毫无问题地添加和保存实体。

我想做的是使用 QueryOver 获取每个博客的评论数,但包括那些没有评论的博客,因此在 SQL 中:

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

得到

Title  CommentsBlog 1 0Blog 2 0Blog 3 0Blog 4 4Blog 5 0

The closest I've got is

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.

最佳答案

为什么你总是在发布问题后立即找到答案?

答案是 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.

关于c# - 使用 QueryOver/ICriteria 在 NHibernate 中聚合左连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12176907/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com