Ошибка при использовании C # Linq SQL CONCAT

#c# #linq-to-sql #concat

#c# #linq-to-sql #конкат

Вопрос:

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

  • Таблица 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() , я получаю сообщение об ошибке

Все запросы, объединенные с использованием операторов ОБЪЕДИНЕНИЯ, ПЕРЕСЕЧЕНИЯ или ИСКЛЮЧЕНИЯ, должны иметь равное количество выражений в своих целевых списках.

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

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

Комментарии:

1. Попробуйте изменить Time = String.Format("{0:hh:mm:ss}", hs.Time) на Time = "foo"

Ответ №1:

Я действительно думаю, что проблема в том, что Sql не распознает вашу строку.Метод форматирования (..).

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

 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 = ""
                       });
 

После этого вы всегда можете просмотреть ход выполнения и отформатировать время в соответствии с вашими потребностями.