Nhibernate查询与Distinct

时间:2014-08-20 13:07:13

标签: sql nhibernate

我在查询中遇到问题,该查询在表格中返回2个相同的客户记录, 所以在我的数据库中,我得到了一个客户表,一个CustomerProduct表,我得到了一个Product表, 顾客可以有很多产品。

public IPagedList<Customer> SearchCustomer(string product, string address, string county)
        {
            ICriteria criteria = Session.CreateCriteria<Customer>()

            .CreateAlias("CustomerProducts", "cp")
            .CreateAlias("cp.Product", "p");

            if (!string.IsNullOrEmpty(product))
            {
                criteria.Add(Restrictions.Like("p.Name", product));
            }
            if (!string.IsNullOrEmpty(address))
            {
                criteria.Add(Restrictions.Like("Address1", address, MatchMode.Anywhere));
            }
            if (!string.IsNullOrEmpty(county))
            {
                criteria.Add(Restrictions.Like("County", county, MatchMode.Anywhere));
            }

            return criteria.Future<Customer>();
}

以上查询返回客户记录两次,因为客户有很多记录! 任何想法/想法如何解决这个问题,都会很棒 谢谢

1 个答案:

答案 0 :(得分:1)

实际上有两种方法:

1)使用事后 Distinct结果转换器:

criteria.SetResultTransformer(NHibernate.Transform.Transformers.DistinctRootEntity);

但我强烈建议:不要这样做。你将永远无法应用分页。

2)不要加入集合,使用BATCH加载(所有)集合

因此,让我们使用批量加载,而不是加入集合并创建cartesion产品:

小引用:

  

NHibernate可以有效地使用批量提取,也就是说,如果访问一个代理(或集合),NHibernate可以加载几个未初始化的代理。批量提取是懒惰选择提取策略的优化。有两种方法可以调整批处理获取:在类和集合级别上。

     

更容易理解批量提取类/实体。想象一下,您在运行时遇到以下情况:您在一个ISession中加载了25个Cat实例,每个Cat都有一个对其所有者的引用,一个Person。 Person类使用代理映射,lazy =“true”。如果您现在遍历所有猫并在每个猫上调用cat.Owner,NHibernate将默认执行25个SELECT语句,以检索代理所有者。您可以通过在Person:

的映射中指定批量大小来调整此行为
<class name="Person" batch-size="10">...</class>

或收藏:

<class name="Person">
    <set name="Cats" batch-size="3">
        ...
    </set>
</class>

请详细了解,请注意以下几点: