【问题标题】:Order by relation count in NHibernate在 NHibernate 中按关系计数排序
【发布时间】:2011-10-14 05:30:51
【问题描述】:

我有这样的数据结构:

public class User
{
    public Guid Id {get;set;}
    public string Name {get;set;}
    public IList<Books> Books {get;set}
}

我一直在努力使按书签数量(一对多关系)对用户进行排序成为可能。

我已经尝试了 linq、criteria 和 queryover 的各种方法,但没有运气,因此希望你们中的一个可以提供帮助。

我正在使用分页,因为我有很多用户,所以解决方案需要在 SQL 上进行查询,而不是在网络服务器的内存中。

【问题讨论】:

    标签: nhibernate criteria linq-to-nhibernate queryover


    【解决方案1】:
    var loadedUser = session.Query<User>()
        .Select(u => new { u, u.Books.Count })
        .ToList()
        .OrderBy(anonym => anonym.Count)
        .Select(anonym => anonym.u);
    

    或使用 HQL

    select user
    from User as user 
        left join user.Books as books
    group by user
    order by count(books)
    

    【讨论】:

    • 我很确定这会很慢,因为你会在内存中而不是在 SQL 数据库中进行排序。
    • @Dofs:如果您不分页,为什么您认为数据库会更快地对其进行排序?数据库也会在内存中完成;它没有一个存在于已知宇宙之外的神奇“分类桶”……
    • 嗨 Diego,我正在使用分页,但没有将其添加到原始问题中。现在已更新。我也在这里尝试了你的扩展:sessionfactory.blogspot.com/2011/02/…,但我得到了错误:NoViableAltException(84@[]) and MismatchedTreeNodeException(70!=3) (Using NH 3.04)
    • @DiegoMijelshon 这并不是说数据库有一个更有效的排序桶(尽管如果关系被索引的话可能会),而是在程序的内存中这样做意味着每个条目都必须被带到线并映射到对象中,然后才能对其进行排序。网络和映射时间可能非常重要。
    • @heneryville ...和?它要么在发送前排序,要么在发送后排序。你只是在改变发生这种情况的地方。
    【解决方案2】:

    见:Order by collection count using ICriteria & NHibernate

    select u
    from User u
    join u.Books b
    group by u
    order by count(b) asc
    

    或者使用 LINQ:

    users.OrderBy(x => x.Books.Count);
    

    【讨论】:

    • 我不知道我是不是做错了什么,但是 NHProfiler 给了我一个 n+1 的问题。
    • 是的,因为所有书籍都将为每个用户提取一次。您应该在查询用户时获取它们。
    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 2011-12-18
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多