Nhibernate 在查询中获取重复结果

Nhibernate 在查询中获取重复结果,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有三个表A、B和C。A是一个父表,在B和C中有多个子记录 当我查询到一个数据集时,我得到了太多的记录,就好像FNH在做笛卡尔乘积一样 我的查询形式如下: var list = session.Query<A>() .Fetch(a=> a.Bs) .Fetch(a=> a.Cs) var list=session.Query() .Fetch(a=>a.Bs) .Fetch(a=>a.Cs) 其中,Bs是A的IList属性,Cs是A的IList属性 我应该只

我有三个表A、B和C。A是一个父表,在B和C中有多个子记录

当我查询到一个数据集时,我得到了太多的记录,就好像FNH在做笛卡尔乘积一样

我的查询形式如下:

var list = session.Query<A>()
  .Fetch(a=> a.Bs)
  .Fetch(a=> a.Cs)
var list=session.Query()
.Fetch(a=>a.Bs)
.Fetch(a=>a.Cs)
其中,Bs是A的IList属性,Cs是A的IList属性

我应该只得到与A相关的尽可能多的b,并且只得到与A相关的尽可能多的Cs。相反,我得到每个元素的BxC元素


有没有更好的方法来加载这些?我很确定我在过去避免了这个问题,但在我以前的示例代码中没有看到它。

您可以使用转换器来获得不同的结果:

var list = session.Query<A>()
  .Fetch(a=> a.Bs)
  .Fetch(a=> a.Cs)
  .SetResultTransformer( Transformers.DistinctRootEntity )
var list=session.Query()
.Fetch(a=>a.Bs)
.Fetch(a=>a.Cs)
.SETRESULT变压器(变压器距离)

这是NH3.2语法,对于2.1,您需要使用新的DistinctRootEntityTransformer()(我认为)作为参数来设置ResultTransformer。

您可以使用Transformer来获得不同的结果:

var list = session.Query<A>()
  .Fetch(a=> a.Bs)
  .Fetch(a=> a.Cs)
  .SetResultTransformer( Transformers.DistinctRootEntity )
var list=session.Query()
.Fetch(a=>a.Bs)
.Fetch(a=>a.Cs)
.SETRESULT变压器(变压器距离)

这是NH3.2语法,对于2.1,您需要使用新的DistinctRootEntityTransformer()(我认为)作为参数来设置ResultTransformer。

我不确定这是NH错误还是映射问题,但是查询可以优化为

session.Query<A>()
    .Fetch(a=> a.Bs)
    .ToFuture();

var results = session.Query<A>()
    .Fetch(a=> a.Cs)
    .ToFuture()
    .ToList();
session.Query()
.Fetch(a=>a.Bs)
.ToFuture();
var results=session.Query()
.Fetch(a=>a.Cs)
.ToFuture()
.ToList();

我不确定这是NH错误还是映射问题,但是可以将查询优化为

session.Query<A>()
    .Fetch(a=> a.Bs)
    .ToFuture();

var results = session.Query<A>()
    .Fetch(a=> a.Cs)
    .ToFuture()
    .ToList();
session.Query()
.Fetch(a=>a.Bs)
.ToFuture();
var results=session.Query()
.Fetch(a=>a.Cs)
.ToFuture()
.ToList();

成功了,谢谢。我不熟悉未来,但我儿子会的!Future将批处理到一起选择,每个将初始化一个集合。会话缓存会将结果关联在一起,并对两个集合中的结果进行初始化。谢谢。我不熟悉未来,但我儿子会的!Future将批处理到一起选择,每个将初始化一个集合。会话缓存将结果关联在一起,并初始化两个集合中的结果