Ошибка от использования C # Linq SQL CONCAT - PullRequest
2 голосов
/ 27 октября 2011

У меня есть следующие три таблицы, и мне нужно ввести информацию из двух разных таблиц.

  • Таблица baTable имеет поля OrderNumber и Position.
  • Таблица accessTable имеет поля OrderNumber и ProcessSequence (среди прочих)
  • Таблица historyTable имеет поля OrderNumber и Time (среди прочих).

.

var progress = from ba in baTable                                   
           from ac in accessTable
           where ac.OrderNumber == ba.OrderNumber
           select new {
                Position = ba.Position.ToString(),
                Time = "", 
                Seq = ac.ProcessSequence.ToString()
           };
progress = progress.Concat(from ba in baTable
                       from hs in historyTable
                       where hs.OrderNumber == ba.OrderNumber
                       select new {
                           Position = ba.Position.ToString(),
                           Time = String.Format("{0:hh:mm:ss}", hs.Time),
                           Seq = ""
                       });
int searchRecs = progress.Count();

Запрос успешно компилируется, но когда SQL выполняется во времяПри вызове Count() я получаю ошибку

Все запросы, объединенные с использованием оператора UNION, INTERSECT или EXCEPT, должны иметь одинаковое количество выражений в своих целевых списках.

Очевидно, что каждый из двух списков состоит из трех элементов, один из которых является константой.Другие справочные советы предположили, что компилятор Visual Studio 2010 C # оптимизировал константы, и я экспериментировал с альтернативами константам.

Самое удивительное, что если запись Time= в select new {...} закомментирован в обоих подзапросах, при выполнении SQL ошибка не возникает.

1 Ответ

1 голос
/ 27 октября 2011

Я действительно считаю, что проблема в том, что Sql не распознает ваш метод String.Format (..).

Измените ваш второй запрос на:

progress = progress.Concat(from ba in baTable
                       from hs in historyTable
                       where hs.OrderNumber == ba.OrderNumber
                       select new {
                           Position = ba.Position.ToString(),
                           Time = hs.Time.ToString(),
                           Seq = ""
                       });

После этого вы всегда можете просмотреть цикл и отформатировать время под свои нужды.

...