代码之家  ›  专栏  ›  技术社区  ›  Noel Kennedy

为什么NHIBERNATE LINQ复制结果?

  •  0
  • Noel Kennedy  · 技术社区  · 15 年前

    我有一个简单的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”集合中,每个酒吧都有一个重复的foo。因此,如果集合中有20个条,比如一个foo实例,我会得到20个foo实例,每个都有20条。

    FOO映射:(FluentHibernate)

    //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的映射时,如果要对关联栏使用延迟加载,则不会出现问题。

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

    1 回复  |  直到 15 年前
        1
  •  3
  •   Sly    15 年前

    问题是当前的LINQ提供程序基于条件查询。在映射中设置fetch.join属性时,如果检查生成的SQL查询,将看到join。由于此联接,您将获得重复的结果。

    在hql中,nhibernate使用不同的方式生成SQL查询,并且SQL将与您的hql类似,这就是为什么没有联接和重复列的原因。

    对于liq查询,可以尝试使用distinct extendion只从查询中获取唯一的结果。

    有一个 project 目前正在开发基于HQL解析器创建LINQ提供程序