为什么NHibernate Linq会复制结果?

为什么NHibernate Linq会复制结果?,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,我有一个简单的Nhibernate Linq查询,返回的结果比预期的多: var result = (from foo in session.Linq<Foo>() where foo.High.ID == High.ID select foo).ToArray(); var result=(来自session.Linq()中的foo) 其中foo.High.ID==High.ID 选择fo

我有一个简单的Nhibernate Linq查询,返回的结果比预期的多:

  var result = (from foo in session.Linq<Foo>()
                      where foo.High.ID == High.ID
                      select foo).ToArray();
var result=(来自session.Linq()中的foo)
其中foo.High.ID==High.ID
选择foo.ToArray();
Foo看起来像这样:

public class Foo : DomainLayerSuperType
{
  // ...other members omitted for clarity
  protected IList<Bar> associatedBars;

}
公共类Foo:DomainLayerSuperType
{
//……为清楚起见,省略了其他成员
受保护的IList关联条;
}
我的问题是“associatedBars”集合中的每个酒吧都有一个重复的Foo。因此,如果集合中有20条Foo实例,我会得到20个Foo实例,每个实例都有20条

Foo的映射:(FluentNhibernate)

//省略了其他映射
有许多(x=>x.AssociatedBars)
.Access.CamelCaseField()
.AsBag()
.表格(“dbo.Bar”)
.KeyColumn(“FooID”)
.Cascade.alldelete孤儿()
.Inverse()
.Fetch.Join()//急件
当我执行这个等价的Hql查询时,问题不会出现:

var query = new StringBuilder();
query.AppendFormat("select foo from Foo foo where foo.High.ID = {0}", High.ID);
var result = session.CreateQuery(query.ToString()).List<Foo>().ToArray();
var query=new StringBuilder();
AppendFormat(“从foo-foo中选择foo,其中foo.High.ID={0}”,High.ID);
var result=session.CreateQuery(query.ToString()).List().ToArray();
另外,当我更改Foo的映射以对关联条使用延迟加载时,问题不会出现


有什么想法吗?另外,Nh Linq的最佳论坛在哪里?我找不到这样贴在这里的

问题在于当前的linq提供程序基于条件查询。当您在映射中设置Fetch.Join属性时,若您检查生成的sql查询,您将在那个里看到Join。由于此连接,您将获得重复的结果

在HQL中,NHibernate使用不同的方式生成sql查询,sql将与HQL非常相似,这就是为什么没有联接和重复列的原因

对于liq查询,您可以尝试使用Distinct扩展来从查询中仅获取唯一的结果


目前正在开发基于HQL解析器的linq提供程序。问题是当前的linq提供程序基于条件查询。当您在映射中设置Fetch.Join属性时,若您检查生成的sql查询,您将在那个里看到Join。由于此连接,您将获得重复的结果

在HQL中,NHibernate使用不同的方式生成sql查询,sql将与HQL非常相似,这就是为什么没有联接和重复列的原因

对于liq查询,您可以尝试使用Distinct扩展来从查询中仅获取唯一的结果

目前正在开发一个基于HQL解析器的linq提供程序

var query = new StringBuilder();
query.AppendFormat("select foo from Foo foo where foo.High.ID = {0}", High.ID);
var result = session.CreateQuery(query.ToString()).List<Foo>().ToArray();