为啥 NHibernate Linq 会重复结果?

Posted

技术标签:

【中文标题】为啥 NHibernate Linq 会重复结果?【英文标题】:Why is NHibernate Linq duplicating results?为什么 NHibernate Linq 会重复结果? 【发布时间】:2009-11-09 10:31:31 【问题描述】:

我有一个简单的 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;


我的问题是“关联酒吧”集合中的每个酒吧都有一个重复的 Foo。因此,如果集合中有 20 个 Foo 实例的 Bars,我会得到 20 个 Foo 实例,每个实例有 20 个 Bars。

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】:

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

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

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

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

【讨论】:

以上是关于为啥 NHibernate Linq 会重复结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这两个 NHibernate 查询会产生不同的结果?

没有 LINQ 扩展的 NHibernate 通用存储库?

将 Linq 中的 NHibernate 应用程序重写为 SQL

linq查询的问题

具有多个结果集的NHibernate存储过程[重复]

Linq to Sql vs Nhibernate vs SubSonic vs 存储过程(帮助)