使用UNION,INTERSECT或EXCEPT运算符组合的所有查询在其目标列表中必须具有相同数量的表达式

时间:2010-01-07 16:29:02

标签: c# asp.net linq-to-sql

我有一个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

3 个答案:

答案 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 {..}

这也将解决它。