Svi*_*ish 6 c# sql linq-to-sql
有人可以帮我解决这个例外吗?我不明白它意味着什么或如何解决它...这是一个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();
Run Code Online (Sandbox Code Playgroud)
如果我删除了a.Union(b)部件,它会毫无例外地运行.所以我知道错误就在那里.但为什么我会得到它?我该如何解决?我在这里做的事太疯狂吗?我误解了如何使用这个Union东西吗?
基本上我所拥有的是一些具有其他实体的外键的实体.我需要获得所有具有该外键设置的null实体或该外来实体满足某些要求的实体.
从您列出的SQL错误判断,您可能遇到了同样的问题.基本上,当Linq to SQL查询在两个不同的查询中使用Concat或Union扩展方法时,Linq to SQL中出现了一个错误,它会单独优化每个投影,而不考虑投影必须保持不变才能完成的事实SQL联盟.
参考文献:
使用UNION或CONCAT时,LINQ to SQL会生成错误的TSQL
如果这恰好是你的问题,我找到了一个适合我的解决方案,如下所示.
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();
Run Code Online (Sandbox Code Playgroud)
由于这看起来像是生成的 SQL 的问题,您应该尝试使用 SQL Profiler,或者使用DebuggerWritter 类的此代码将 SQL 写入 Visual Studio 中的输出窗口。
SQL 错误通常是由为 UNION 检索的字段与 2 个查询不同造成的。例如,如果第一个查询可能有 3 个字段,但第二个查询有 4 个字段,则会出现此错误。因此,在这种情况下,查看生成的 SQL 肯定会有所帮助。
| 归档时间: |
|
| 查看次数: |
4118 次 |
| 最近记录: |