Все запросы, объединенные с использованием оператора UNION, INTERSECT или EXCEPT, должны иметь одинаковое количество выражений в своих целевых списках. - PullRequest
2 голосов
/ 07 января 2010

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

Например, мой код псевдо

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

})

после нескольких часов поиска в Google я понял, что это ошибка в 3.5 framework.

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

var a= first query

var b =second query

ilist result =a.union b

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

Как мне его сформировать

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

С уважением Хема

Ответы [ 3 ]

3 голосов
/ 21 января 2010

Это, скорее всего, результат известной проблемы с 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 голосов
/ 07 января 2010

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

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

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

до

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

И это тоже решит проблему.

0 голосов
/ 07 января 2010

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

...