【问题标题】:Nhibernate query with Distinct具有 Distinct 的休眠查询
【发布时间】:2014-08-20 21:12:33
【问题描述】:

我的查询在表中返回 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>();
}

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

【问题讨论】:

    标签: sql nhibernate


    【解决方案1】:

    其实有两种方法:

    1) 使用 ex post 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>
    

    如需了解更多详情,请务必遵守以下规定:

    【讨论】:

    • 嗯,我是 nhiberate 的新手,你能告诉我怎么做吗??
    • 嗯,这并不复杂。正如代码 sn-p 所示。只需使用batch-size="25" 标记您的收藏。而已。从那一刻起,不要为此集合使用 CreateAlias .. 只需查询根实体。收到根实体列表后,您可以访问它们的集合,这些集合将分几批加载……尝试阅读有关批量大小的信息……非常酷的功能。我是 1) 在任何地方都使用批量大小... 2) 从不查询根及其集合.. NHiberante 然后工作得非常快速有效(没有 1+N 选择)
    • ... ... ,我是否将此 XML 标记添加到 Nhibernate.config 中?你有什么好的例子/链接吗?谢谢
    • 你用的是fluent吗?使用这个:stackoverflow.com/a/20999028/1679310 你在使用.hbm.xml 文件的映射吗?使用这个:stackoverflow.com/questions/20970680 - 我们正在谈论映射所以这个设置在你的情况下与集合CustomerProducts
    • 很高兴看到这一点,先生! ;) 享受 NHibernate... 了不起的工具 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多