Добавить собственный код SQL в nHibernate QueryOver - PullRequest
0 голосов
/ 28 мая 2020

У меня есть запрос QueryOver, в котором я получаю несколько строк по списку идентификаторов, где идентификатор - это сложный первичный ключ, состоящий из двух значений. Это приводит к тому, что в базу данных отправляется слишком много параметров, и я получаю сообщение об ошибке.

Запрос состоит из трех частей, например:

var disjunction = Restrictions.Disjunction();
foreach (var id in MyIds) //currently: MyIds.Take(350)
{
    disjunction.Add(Restrictions.Where<MyEntity>(x => x.ID == id)); // ID is object with 2 properties
}

var query = session.QueryOver<MyEntity> // first query "branch"
            .Left.JoinAlias(...)
            .Where(disjunction)
            .Future();

            session.QueryOver<MyEntity> // second query "branch"
            .Left.JoinAlias(...)
            .Where(disjunction)
            .Future();

            session.QueryOver<MyEntity> // third query "branch"
            .Left.JoinAlias(...)
            .Where(disjunction)
            .Future();

return query.ToList();

Поскольку у меня три части, а ключ состоит из из двух свойств я получаю 3 * 2 * MyIds.Count() параметров. Итак, чтобы избежать превышения 2100 параметров, мне нужно было бы ограничить количество передаваемых параметров (отсюда .Take(350)), что далеко от идеала - мне нужны все они, а не только некоторые.

Есть ли способ каким-то образом передать эту disjunction как одну настраиваемую строку SQL, сделав ее единственным параметром? Или, может быть, какой-нибудь другой способ обойти это?

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

Я рассматривается SQL инъекция, и здесь это не проблема, поскольку пользователь не вводит данные.

...