代码之家  ›  专栏  ›  技术社区  ›  Mark Struzinski

使用标准API从NHibernate中获得不同的结果集?

  •  29
  • Mark Struzinski  · 技术社区  · 16 年前

    我正在尝试使用NHibernate中的标准API获得不同的结果。我知道使用HQL是可能的,但是我更喜欢使用标准API来完成这项工作,因为我的应用程序的其余部分只使用了这个方法。我 found this forum post 但是还没能让它工作。是否有一种使用标准API获取不同结果集的方法?

    编辑:在执行此操作时,我还希望排除主键列(也是标识),并获取其余的不同记录。有办法吗?实际上,不同的记录返回重复项,因为主键对于每一行都是唯一的,但所有其他字段都是相同的。

    5 回复  |  直到 8 年前
        1
  •  24
  •   Juanma    16 年前

    此时无法看到论坛帖子(断开链接?),因此可能这不是答案,但您可以添加一个DistinctRootEntityResultTransformer:

    session.CreateCriteria(typeof(Product)
        .Add(...)
        .SetResultTransformer(new DistinctEntityRootTransformer())
    
        2
  •  87
  •   David Duponchel Shiha Mohan    8 年前

    要执行不同的查询,可以将条件上的投影设置为projects.distinct。然后包含要返回的列。然后,通过将结果转换器设置为AliasToBeanResultTransformer(传入结果应转换为的类型),结果将变回强类型对象。在本例中,我使用的类型与实体本身相同,但您可以为此查询专门创建另一个类。

    ICriteria criteria = session.CreateCriteria(typeof(Person));
    criteria.SetProjection(
        Projections.Distinct(Projections.ProjectionList()
            .Add(Projections.Alias(Projections.Property("FirstName"), "FirstName"))
            .Add(Projections.Alias(Projections.Property("LastName"), "LastName"))));
    
    criteria.SetResultTransformer(
        new NHibernate.Transform.AliasToBeanResultTransformer(typeof(Person)));
    
    IList<Person> people = criteria.List<Person>();
    

    这将创建类似于(至少在SQL Server中)的SQL:

    SELECT DISTINCT FirstName, LastName from Person
    

    请注意,结果中将只填充您在投影中指定的属性。

    这种方法的优点是过滤是在数据库中执行的,而不是将所有结果返回给应用程序,然后进行过滤——这是DistinctRootEntityTransformer的行为。

        3
  •  6
  •   Jon Adams    11 年前

    为了它的价值, NHibernate: Optimising Queries with Projections 帮助我解决了基本上相同的问题。

        4
  •  -1
  •   beauXjames    10 年前

    我们正在用最现代、最强大、最微小的方法来处理这件事……只有当你准备好去面对可怕的事物时,才能继续读下去……这与标准无关……

    CurrentSession()
        .QueryOver<GoodBadAndUgly>
        .Where(...)
        .TransformUsing(Transformers.DistinctRootEntity)
    

    所以,如果你来这里希望找到一种方法来做到这一点,那就避免了干扰标准,即使你认为你完全必须朝着这个方向前进,只是为了在你的SQL中添加“distinct”…不要再搜索了。

        5
  •  -4
  •   frank    16 年前

    我还遇到了项目数不明确的问题(我在映射文件中使用fetch=“join”)。我用linq-to-nhiberinate来解决这个问题,它的用法如下:

           var suppliers = (from supplier in session.Linq<Supplier>()
                            from product in supplier.Products
                            where product.Category.Name == produtCategoryName
                            select supplier).ToList().Distinct();