有几种方法可以做到这一点,但我在QueryOver中不知道。您可以将 QueryOver 查询视为几乎直接转换为 SQL。如果您这样想,就不可能List
一步填充属性(至少在不使用某种聚合的情况下,您无法编写导致 ID 和项目“列表”的 SQL 查询)。
考虑到这一点,我认为最好在这里定义一种新型的中间 DTO。
public class FlattenedDTO
{
public int IdA { get; set; }
public string Name { get; set; }
}
然后你会写你的查询,投影到FlattenedDTO
. 在我们选择了一个FlattenedDTO
s 列表之后,我们可以将它们分组到一个新的DTO
s 列表中:
B bAlias = null;
FlattenedDTO result = null;
session.QueryOver<A>()
.JoinQueryOver<AB>(a => a.ABs)
.JoinQueryOver(ab => ab.B, () => bAlias)
.SelectList(list => list
.Select(a => a.Id).WithAlias(() => result.IdA)
.Select(() => bAlias.Name).WithAlias(() => result.Name))
.TransformUsing(Transformers.AliasToBean<FlattenedDTO>())
.List<FlattenedDTO>()
// At this point the query has been run and we just need to group the results
.GroupBy(dto => dto.IdA, dto => dto.Name)
.Select(grp => new DTO { IdA = grp.Key, Names = grp.ToList() });
这将最终发出一个查询:
SELECT this_.IdA as y0_,
balias2_.Name as y1_
FROM [A] this_
inner join [AB] ab1_
on this_.Id = ab1_.IdA
inner join [B] balias2_
on ab1_.IdB = balias2_.Id
并将结果分组到内存中。还有其他几种方法可以做到这一点,所以如果这不符合您的需求,请告诉我。