使用查询获取实体的注释总数

时间:2012-11-05 15:06:07

标签: nhibernate join queryover

我正在尝试获取实体的总评论但我收回的结果不正确。

我如何获得任务及其评论计数(急切加载)

        var tasks = _session.QueryOver<Task>(() => taskAlias)
                                 .Where(x => x.OrganizationID == null)
                                 .Fetch(x => x.AssignedUser).Eager
                                 .Fetch(x => x.Owner).Eager
                                 .Fetch(x => x.Comments).Eager
                                 .List();

返回:

Task.ID 1评论3 Task.ID 1评论3 Task.ID 1评论3

Task.ID 2评论2 Task.ID 2评论2

Task.ID 3评论1

我想:

Task.ID 1评论3

Task.ID 2评论2

Task.ID 3评论1

我的流利映射是:

HasMany(x => x.Comments).Table("tComments").ForeignKeyConstraintName("fT_Task_ID").KeyColumn("fC_Resource_ID").Where("fC_Type = 'Task'").ReadOnly();

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,问题是您获得正确的数据,它只是在根级别重复。如果是这种情况,请将查询更改为:

var tasks = _session.QueryOver<Task>(() => taskAlias)
                                 .Where(x => x.OrganizationID == null)
                                 .Fetch(x => x.AssignedUser).Eager
                                 .Fetch(x => x.Owner).Eager
                                 .Fetch(x => x.Comments).Eager
                                 .TransformUsing(new DistinctRootEntityResultTransformer())
                                 .List();

当你有一个实体并且它包含一组实体并且你告诉NHibernate急切地获取集合时,生成的SQL将基本上返回为:

TASK 1 - COMMENTS 1A
TASK 1 - COMMENTS 1B
TASK 1 - COMMENTS 1C
TASK 2 - COMMENTS 2A
TASK 2 - COMMENTS 2B
...

DistinctRootEntityResultTransformer是我们用来告诉NHibernate根元素应该是唯一的。由于您的原始代码没有变换器,因此您的根元素是重复的。