【问题标题】:How do you do inner joins and paging in NHibernate?你如何在 NHibernate 中进行内部连接和分页?
【发布时间】:2011-07-23 10:32:57
【问题描述】:

我对 NHibernate 比较陌生,我正在尝试做一些看起来很棘手的事情......

我的关系如下:

用户 公司 店铺

我想要得到的是给定用户的分页商店列表。 我的方法是这样的:

public PagedCollection<Shop> GetForUser(int userId, int page, int pageSize, string sortColumn, Enums.SortDirection sortDirection)
    {
        using (var session = NHibernateHelper.OpenSession())
        {
            //.. Todo!
        }
    }

为了完整起见,生成的分页集合对象具有以下属性:

public ICollection<T> Items { get; private set; }
public int PageNumber { get; private set; }
public int ItemsPerPage { get; private set; }
public int TotalItems { get; private set; }

我猜这里有两个问题:

1) 如何使用 page/pagesize/sort 约束获取项目总数和项目列表?

2) 我如何进行所需的内部连接以从用户转到商店表?

如果可能的话,我真的很喜欢完全输入的答案,而不是 sql 字符串!

【问题讨论】:

    标签: c# nhibernate


    【解决方案1】:
    1. ToRowCountQuery()、Take()、Skip()、OrderBy()。见here
    2. JoinQueryOver()(见here

    【讨论】:

      【解决方案2】:

      如果你使用的是 3.0,你可以使用:

      session.QueryOver<Entity1>()
      .Where(x => x.Compare1 == 5)
      .JoinQueryOver<Entity2>(x => x.Entity2)
      .Where(x => x.Compare2 == 10)
      .Skip(10)
      .Take(5)
      .List()
      

      【讨论】:

        【解决方案3】:

        虽然@BradLaney 和@sJhonny 的两个答案都很有用,但我仍然需要进行一些挖掘才能得出有效的结果。由于我无法将两者都勾选为正确,因此我决定发布我的工作代码作为答案:

        var queryOver = session.QueryOver<Shop>()
                                .JoinQueryOver(s => s.Company)
                                .JoinQueryOver<User>(c => c.Users)
                                .Where(u => u.Id == userId);
        
        IEnumerable<T> list = queryOver
                    .OrderBy(Projections.Property(sortColumn)).Asc
                    .Take(itemsPerPage)
                    .Skip(pageNumber * itemsPerPage)
                    .Future();
        if (sortDirection == ESortDirection.Descending) list = list.Reverse();
        int totalCount = queryOver.ToRowCountQuery().FutureValue<int>().Value;
        
        return new PagedCollection<T>(list.ToList(), pageNumber, itemsPerPage, totalCount);
        

        我对排序方向子句不太满意,但我不确定如何使用流畅的界面来做到这一点。(见下文)

        另外,我将分页内容包装到一个类似于@Jhonny 提到的扩展方法中。

        编辑: 我添加了以下扩展方法来处理排序:

        public static IQueryOver<T, U> OrderBy<T, U>(this IQueryOver<T, U> queryOver, IProjection projection, ESortDirection sortDirection)
            {
                if (sortDirection == ESortDirection.Descending) return queryOver.OrderBy(projection).Desc;
                else return queryOver.OrderBy(projection).Asc;
            }
        

        谢谢!

        【讨论】:

        猜你喜欢
        • 2014-07-23
        • 2010-09-30
        • 2021-05-20
        • 2018-06-16
        • 2019-03-22
        • 2011-03-18
        • 2016-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多