当前位置:  开发笔记 > 编程语言 > 正文

关于UNION,INTERSECT和EXCEPT的SqlException

如何解决《关于UNION,INTERSECT和EXCEPT的SqlException》经验,为你挑选了1个好方法。

有人可以帮我解决这个例外吗?我不明白它意味着什么或如何解决它...这是一个SqlException,带有以下消息:

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

我在伪代码中运行查询时得到它,如下所示:

// Some filtering of data
var query = data.Subjects
            .Where(has value)
            .Where(has other value among some set of values);

// More filtering, where I need to have two different options
var a = query
            .Where(some foreign key is null);
var b = query
            .Where(some foreign key is not null)
            .Where(and that foreign key has a property which is what I want);
query = a.Union(b);

// Final filter and then get result as a list
var list = query
            .Where(last requirement)
            .ToList();

如果我删除了a.Union(b)部件,它会毫无例外地运行.所以我知道错误就在那里.但为什么我会得到它?我该如何解决?我在这里做的事太疯狂吗?我误解了如何使用这个Union东西吗?

基本上我所拥有的是一些具有其他实体的外键的实体.我需要获得所有具有该外键设置的null实体或该外来实体满足某些要求的实体.



1> jpierson..:

从您列出的SQL错误判断,您可能遇到了同样的问题.基本上,当Linq to SQL查询在两个不同的查询中使用Concat或Union扩展方法时,Linq to SQL中出现了一个错误,它会单独优化每个投影,而不考虑投影必须保持不变才能完成的事实SQL联盟.

参考文献:

使用UNION或CONCAT时,LINQ to SQL会生成错误的TSQL

Linq to SQL Union相同字段名生成错误

如果这恰好是你的问题,我找到了一个适合我的解决方案,如下所示.

var queryA = 
    from a in context.TableA
    select new 
    {
        id,
        name,
        onlyInTableA,
    }

var queryB = 
    from b in context.TableB
    let onlyInTableA = default(string)
    select new 
    {
        id,
        name,
        onlyInTableA,
    }

var results = queryA.Union(queryB).ToList();


我同意,即使是let语句,.NET 4仍然存在.然而,在v4中似乎停止优化器的更难看的黑客操作是在let语句上执行一个毫无价值的操作,该操作不会改变它的结果,比如连接一个emptry字符串或添加零.在这种情况下,类似下面的内容可能会起作用:let onlyInTableA = default(string)+ default(string)
这是一个可怕的消息,似乎不仅.NET Framework 4.0没有纠正这个问题,而且它还压制了我上面提到的解决方法.
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有