为什么NHibernate Linq会重复结果?

时间:2009-11-09 10:31:32

标签: nhibernate linq-to-nhibernate

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

  var result = (from foo in session.Linq<Foo>()
                      where foo.High.ID == High.ID
                      select foo).ToArray();

Foo看起来像这样:

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

}

我的问题是我在'associatedBars'集合中为每个Bar获得了重复的Foo。因此,如果集合中有20个条形作为Foo的实例,我会得到20个Foo实例,每个实例有20个条。

Foo的映射:(FluentNhibernate)

//other mappings omitted
HasMany<Bar>(x => x.AssociatedBars)
                .Access.CamelCaseField()
                .AsBag()
                .Table("dbo.Bar")
                .KeyColumn("FooID")
                .Cascade.AllDeleteOrphan()
                .Inverse()
                .Fetch.Join(); //eager load

当我执行此等效的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();

此外,当我更改Foo的映射时,要对AssociatedBars使用延迟加载,问题不会发生。

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

1 个答案:

答案 0 :(得分:3)

问题是当前的linq提供程序基于条件查询。当您在映射中设置Fetch.Join属性时,如果您检查生成的sql查询,您将看到在那里加入。由于这次加入,你会得到重复的结果。

在HQL中NHibernate使用不同的方式生成sql查询,而sql将类似于你的HQL,这就是为什么没有连接而没有重复的列。

对于liq查询,您可以尝试使用Distinct extention来获取查询中的唯一结果。

目前正在开发基于HQL解析器创建linq提供程序的project