#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 = ""
});
После этого вы всегда можете просмотреть ход выполнения и отформатировать время в соответствии с вашими потребностями.