У меня есть запрос 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. Когда значение столбца ссылается дважды, оно оптимизируется из результирующего набора (даже если вам может понадобиться его объединение).
Наиболее общая задача заключается в использовании операторов 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
Отбросьте нули, как упоминалось в @GalacticJello, но также запустите первые параметры запроса, которые будут иметь нули в другом запросе для нулевой версии типа. Например, если минарея десятичная, переведите ее в десятичную; вы можете сделать это с помощью: new Nullable (i.minarea), чтобы убедиться, что он соответствует правильному типу.
Вероятно, он выводит другую анонимную подпись для обоих запросов. Кроме того, чтобы устранить проблемы, создайте класс с этими свойствами и измените запрос:
выберите новый {..}
к
выберите новый MyObj {..}
И это тоже решит.
В SQL это обычно означает, что вам нужно отбросить эти нули в качестве соответствующего типа данных для первой части объединения, поэтому сделайте для них значения по умолчанию для нужных вам типов, например "" или String.Empty для строки значения или 0 для int и т.д.