Выбор идентификатора из базы данных, где нет большой коллекции, слишком много параметров - PullRequest
4 голосов
/ 15 сентября 2011

Я работаю над приложением, имеющим две базы данных.

У меня есть объект, назовем его permit, у которого есть список идентификаторов, ссылающихся на идентификаторы из таблицы, давайте вызовем этот tasks в другой базе данных.

Я пытаюсь выполнить следующий запрос:

var listOfUsedIds = select taskid from Permit_Task;
Select * from task where id not in (listOfUsedIds)

Когда я запускаю этот код, я получаю сообщение об ошибке:

Удаленный вызов процедур (RPC) входящего потока табличных данных (TDS) неверный поток протокола.
Слишком много параметров было предоставлено в этом запросе RPC. Максимум 2100.

Я не могу запустить вспомогательный выбор или что-то еще, потому что NHibernate не позволит мне сделать это для двух баз данных.

Может кто-нибудь помочь мне, как обойти эту проблему?

Ответы [ 2 ]

1 голос
/ 15 сентября 2011
using (var tx = session.BeginTransaction())
{
    session.CreateSQLQuery("CREATE TEMP TABLE usedIds (id INT)").ExecuteUpdate();

    for (int index = 0; index < ids.Length; index++)
    {
        // TODO: batch this
        session.CreateSQLQuery("INSERT INTO usedIds VALUES (:p" + index + ")")
            .SetParameter("p" + index, id)
            .ExecuteUpdate();
    }

    session.CreateSQLQuery("CREATE INDEX usedIds_idx ON usedIds (id)").ExecuteUpdate();


    Batch batch;
    while((batch.List = session.CreateSQLQuery("SELECT id FROM tasks t WHERE 1 = (SELECT COUNT(*) FROM usedIds u WHERE u.id = t.id) LIMIT 10 OFFSET " + batch.Number).List<int>()).Count > 0)

    {
        var tasks = session.QueryOver<Task>()
            .Where(t => t.Id.IsIn(batch))
            .List();
        // Do something with the tasks
    }
    tx.Commit();
}

или

public TaskMap()
{

    Map(x => x.IsUsedCount).Formula("SELECT (SELECT COUNT(*) FROM usedIds u WHERE u.Id = Id)").LazyLoad();
}

var tasks = session.QueryOver<Task>()
    .Where(t => t.IsUsedCount == 0)
    .List();
0 голосов
/ 15 сентября 2011

Просто разбейте listOfUsedIds на более мелкие блоки (скажем, по 200 идентификаторов каждый), выполните запрос для каждого блока и .Concat() результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...