Indermove
@Indermove
C#/.NET back-end разработчик

Как сформулировать пагинацию предметов по игрокам в NHibernate?

Всем доброго дня, товарищи! Столкнулся с такой проблемой. Есть таблица игроков, есть таблица предметов. У каждого игрока может быть любое количество предметов. Нужно вывести все предметы для заданного количества игроков. SQL запрос составил, но не могу перегнать его в NHibernate запрос.

SQL запрос:
select * from 
(select * from player_info order by login ASC limit 100 offset 0)  as plr
left join items itm
   on plr.id = itm.user_id;


NHibernate запрос который не работает:
var getBatchOfPlayers = QueryOver.Of<PlayerInfoEntity>()
    .Where(entity => entity.IsSimulation == player.IsSimulation && entity.Role.IsIn(roles))
    .OrderBy(entity => entity.Login).Asc
    .Select(entity => entity.Login)
    .Skip(startOffset).Take(limit);

res = session.QueryOver<ItemsEntity>()
    .WithSubquery.WhereProperty(entity => entity.Player.Login).In(getBatchOfPlayers)
    .Cacheable().CacheMode(CacheMode.Normal)
    .List().GroupBy(x => x.Player.Login)
    .Select(ConvertSpecial)
    .ToList();


Stackoverflow уже весь облазил не нашел того что нужно. Буду благодарен за любые наводки на решение.
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
Indermove
@Indermove Автор вопроса
C#/.NET back-end разработчик
В общем, оставим для потомков, может когда-то кому-то поможет. Немного исправив запрос получим вот такой результат:

var getBatchOfPlayers = QueryOver.Of<PlayerInfoEntity>()
    .Where(entity => entity.IsSimulation == player.IsSimulation && entity.Role.IsIn(roles))
    .OrderBy(entity => entity.Login).Asc
    .Select(entity => entity.Id) // Исправили Login на Id
    .Skip(startOffset).Take(limit);

res = session.QueryOver<ItemsEntity>()
    .WithSubquery.WhereProperty(entity => entity.Player.Id).In(getBatchOfPlayers) // Исправили Login на Id
    .Cacheable().CacheMode(CacheMode.Normal)
    .List().GroupBy(x => x.Player.Login)
    .Select(ConvertSpecial)
    .ToList();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы