Как вы делаете внутренние соединения и пейджинг в NHibernate? - PullRequest
0 голосов
/ 22 июля 2011

Я относительно новичок в NHibernate, и я пытаюсь сделать что-то, что кажется довольно сложным ...

У меня есть следующие отношения:

Пользователь <* ---- 1> Компания <1 ---- *> Магазин

То, что я хочу получить, это постраничный список магазинов для данного пользователя. Мой метод выглядит так:

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, если это вообще возможно!

Ответы [ 3 ]

2 голосов
/ 22 июля 2011
  1. ToRowCountQuery (), Take (), Skip (), OrderBy ().см. здесь
  2. JoinQueryOver () (см. здесь )
1 голос
/ 22 июля 2011

Хотя оба ответа @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;
    }

Спасибо!

1 голос
/ 22 июля 2011

Если вы используете 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...