Я обнаружил очень неприятную ошибку с Linq-to-sql, и я не уверен, какое решение лучше.
Если вы берете простое утверждение L2S Union и включаете код L2S вс одной стороны, и константы с другой, то константы не включаются в объединение SQL и проецируются только в вывод после SQL, что приводит к ошибкам SQL относительно количества столбцов, не связанных для объединения.
В качестве примера:
(from d in dc.mytable where foo == "bar" select new {First = d.Foo, Second = d.Roo})
.Union(from e in dc.mytable where foo == "roo" select new {First= "", Second = e.Roo})
Это приведет к ошибке "Все запросы, объединенные с использованием оператора UNION, INTERSECT или EXCEPT, должны иметь одинаковое количество выражений в своих целевых списках.
Это особенно коварно (и сводит с ума), потому что в списке, очевидно, одинаковое количество выражений, но когда вы посмотрите на SQL, вы заметите, что он не генерирует столбец для «первого» во второй половине объединения.Это потому, что «Первый» вставляется в проекцию ПОСЛЕ запроса.
Хорошо, простое решение - просто конвертировать each часть в Enumerables или Lists или что-то еще, а затем объединение в памяти, а не в SQL, и это нормально, если вы имеете дело с небольшим количеством данных.Однако, если вы работаете с большим набором данных, которые затем планируете дополнительно отфильтровать (в sql) перед возвратом, это не идеально.
Я думаю, что я ищу способзаставить L2S включить столбец в SQL.Возможно ли это?
ОБНОВЛЕНИЕ:
Хотя это и не точный дубликат, эта ошибка похожа на Этот вопрос и имеет аналогичные решения.Итак, я закрываю, но не удаляю этот вопрос, потому что он может помочь кому-то еще прийти к возможным решениям другим способом.
К сожалению, L2S иногда слишком умён для своего блага.