我有一个linq to sql查询,我必须执行union两组记录。 而且我没有相同数量的字段,所以添加了空
例如我的伪代码是
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
这也会导致同样的错误。
我该如何形成
提前致谢
此致 HEMA
答案 0 :(得分: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 about UNION, INTERSECT and EXCEPT
答案 1 :(得分:0)
在SQL中,这通常意味着您需要将这些空值转换为union的第一部分的相应数据类型,因此将它们设置为所需类型的默认值,例如“”或字符串的String.Empty值,或0表示整数等...
答案 2 :(得分:0)
如@GalacticJello所提到的那样抛出空值,但是也会将第一个查询的参数转换为该类型的可空版本,该参数将在另一个查询中具有空值。例如,如果minarea是十进制,则将其转换为小数?你可以通过:new Nullable(i.minarea)来确保它推断出正确的类型。
它可能会推断出两个查询的不同匿名签名。另外,为了缓解这些问题,请创建一个具有这些属性的类,并从以下位置更改查询:
选择新的{..}
到
选择新的MyObj {..}
这也将解决它。