Почему я не могу получить результаты Concat или Union в пустой список? - PullRequest
1 голос
/ 17 февраля 2012

К сожалению, SQL Server не может обработать список параметров, который превышает 2100 параметров. У меня есть несколько запросов, которые при запуске в пакетном режиме превышают этот предел. Чтобы получить желаемые результаты и быстро просмотреть набор данных, я решил использовать Skip(i).Take(2000) в цикле for.

Я не был готов к тому, что Union и Concat требуют, чтобы IEnumerable был больше, чем просто экземпляр для работы. Конечно, он пустой, но я, должно быть, упускаю что-то фундаментальное в их использовании. В любом случае, чтобы решить проблему, я использовал List и AddRange. Я использую NHibernate, но не думаю, что факторы, почему Union и Concat не работают.

var machineResults = new List<Machine>();

for (int i = 0; i < machines.Count(); i += 2000)
{
                   // I would have expected Union or Concat to work here
    machineResults.AddRange(GetSession().CreateQuery(
       @"select distinct m
        from Machine m
        where m in (:MachinesList)") // there's more criteria than this
       .SetParameterList("MachinesList",
                          machines.Skip(i).Take(2000).ToList())
       .List<Machine>());                
}

return machineResults;

Так что же мне не хватает в Union и Concat? Почему они не работают в приведенном выше заявлении? Я понимаю, почему AddRange работает, но что, если я был обеспокоен уникальностью своих результатов и хотел использовать Union?

1 Ответ

10 голосов
/ 17 февраля 2012

Union и Concat - чистые методы. Они не изменяют объект, на котором они запущены, а возвращают копию.

var a = new [] {1, 2, 3, 4};
var b = new [] {5, 6, 7, 8};

var c = a.concat(b);

После запуска этого кода

a => [1, 2, 3, 4] b => [5, 6, 7, 8] c => [1, 2, 3, 4,5, 6, 7, 8]

То есть, если у вас было machineResults.concat(x), вы на самом деле не изменяете коллекцию machineResults. Вместо этого вы должны иметь machineResults = machineResults.concat(x).

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