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

2

У меня есть запрос linq to sql, где я должен выполнить объединение двух наборов записей. И у меня нет равного количества полей, поэтому добавлен нуль

например, мой код psuedo

var Values=( from c in containers

                   some joins
                   select new PValues

{
 regionid=r.regionid,

  roomid=r.roomid,

  floorid=r.floorid,

  maxarea=r1.maxarea,

  minarea=r1.minarea,

  avgarea=r1.avgarea,

  maxheight=r1.maxheight,

  minheight=r1.minheight

})
.union

( from c in containers

                   some joins

                   select new PValues

{ regionid=j.regionid,

  roomid=j.roomid,

  floorid=j.floorid,

  maxarea=null,

  minarea=null,

  avgarea=null,

  maxheight=j1.maxheight,

  minheight=j1.minheight

})

после того, как через несколько часов я пришел к пониманию, что это ошибка в структуре 3.5.

Теперь я хочу получить результат. Как это сделать Я пробовал обрамление в два отдельных iqueryable

var a= first query

var b =second query

ilist result =a.union b

Это также приводит к той же ошибке.

Как мне его создать

Заранее спасибо

Отношения Хема

Теги:
linq-to-sql

3 ответа

3

Это, скорее всего, результат известной проблемы с LINQ to SQL. Когда значение столбца ссылается дважды, оно оптимизируется из результирующего набора (даже если вам может понадобиться его объединение).

Наиболее общая задача заключается в использовании операторов let:

var Values=(
    from c in containers
    some joins
    //You'll need one let statement for each COLUMN, even if they share a value.
    let maxAreaValue = null
    let minAreaValue = null
    let avgAreaValue = null
    select new PValues
    {
        regionid=j.regionid,
        roomid=j.roomid,
        floorid=j.floorid,
        maxarea=maxAreaValue,
        minarea=minAreaValue,
        avgarea=avgAreaValue,
        maxheight=j1.maxheight,
        minheight=j1.minheight
    });

Дополнительная информация:
https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=355734
http://slodge.blogspot.com/2009/01/linq-to-sql-and-union-all-queries.html
SqlException об UNION, INTERSECT и EXCEPT

  • 0
    Это сработало для меня.
  • 0
    Из того, что я понял, этот обходной путь перестал работать с .Net 4.0, который теперь также оптимизирует операторы let. Одна вещь, которую вы можете сделать, это выполнить какую-то операцию со значением, чтобы предотвратить его оптимизацию. например, просто добавьте ноль к числу или объедините "" для строки.
0

Отбросьте нули, как упоминалось в @GalacticJello, но также запустите первые параметры запроса, которые будут иметь нули в другом запросе для нулевой версии типа. Например, если минарея десятичная, переведите ее в десятичную; вы можете сделать это с помощью: new Nullable (i.minarea), чтобы убедиться, что он соответствует правильному типу.

Вероятно, он выводит другую анонимную подпись для обоих запросов. Кроме того, чтобы устранить проблемы, создайте класс с этими свойствами и измените запрос:

выберите новый {..}

к

выберите новый MyObj {..}

И это тоже решит.

0

В SQL это обычно означает, что вам нужно отбросить эти нули в качестве соответствующего типа данных для первой части объединения, поэтому сделайте для них значения по умолчанию для нужных вам типов, например "" или String.Empty для строки значения или 0 для int и т.д.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню