Linq to sql 具有常量值和投影的并集(或Concat等)

Linq to sql 具有常量值和投影的并集(或Concat等),linq-to-sql,constants,unions,Linq To Sql,Constants,Unions,我发现LINQtoSQL有一个非常糟糕的问题,我不确定最好的解决方案是什么 如果采用一个简单的L2S Union语句,并在一侧包含L2S代码,在另一侧包含常量,则这些常量不会包含在SQL Union中,而只会投影到SQL之后的输出中,从而导致有关未匹配Union的列数的SQL错误 例如: (from d in dc.mytable where foo == "bar" select new {First = d.Foo, Second = d.Roo}) .Union(from e in dc.

我发现LINQtoSQL有一个非常糟糕的问题,我不确定最好的解决方案是什么

如果采用一个简单的L2S Union语句,并在一侧包含L2S代码,在另一侧包含常量,则这些常量不会包含在SQL Union中,而只会投影到SQL之后的输出中,从而导致有关未匹配Union的列数的SQL错误

例如:

(from d in dc.mytable where foo == "bar" select new {First = d.Foo, Second = d.Roo})
.Union(from e in dc.mytable where foo == "roo" select new {First= "", Second = e.Roo})
这将生成一个错误:“使用UNION、INTERSECT或EXCEPT运算符组合的所有查询在其目标列表中必须具有相同数量的表达式

这尤其阴险(令人恼火),因为列表中显然有相同数量的表达式,但当您查看SQL时,您会注意到它不会在联合的后半部分为“First”生成列。这是因为“First”在查询后插入到投影中

好的,简单的解决方案是将每个部分转换为可枚举的、列表或其他内容,然后在内存中进行联合,而不是在SQL中进行联合,如果您处理的是少量数据,这也没关系。但是,如果您处理的是大量数据,那么在返回数据之前计划进一步过滤(在SQL中),这并不理想

我想我要寻找的是一种强制L2S在SQL中包含列的方法。这可能吗

更新:

虽然不是一个完全重复的错误,但这个错误类似于,并且有类似的解决方案。所以我结束,但不删除这个问题,因为它可能会帮助其他人从不同的角度得出可能的解决方案


不幸的是,L2S有时太聪明了,因为它本身是好的。

我认为唯一真正的解决方案是使用存储过程。希望这能有所帮助。

这是Linq2SQL提供程序中的一个错误。 在LinqPad中,您可以清楚地看到错误

(from d in dc.mytable where foo == "bar" select new {First = d.Foo, Second = d.Roo})  
.Union(from e in dc.mytable where foo == "roo" select new {First= "", Second = e.Roo}) 
服务器端是否会产生如下内容:

SELECT [t2].[Foo], [t2].[Roo]
FROM (
    SELECT [t0].[Foo], @p0 AS [value]
    FROM [dc].[Mytable] AS [t0]
    UNION ALL
    SELECT [t1].[Foo], [t1].[Roo]
    FROM [dc].[Mytable] AS [t1]
    ) AS [t2]
这将是一个问题,因为联合将第二列命名为“value”而不是“Roo”,这将导致外部查询失败

但是,如果您切换两个表的顺序

(from e in dc.mytable where foo == "roo" select new {First= "", Second = e.Roo})  
.Union(from d in dc.mytable where foo == "bar" select new {First = d.Foo, Second = d.Roo}) 
因此,生成的T-SQL中的常量赋值会出现在非第一个表中,然后事情可能会发生,因为T-SQL会忽略后续表的列名


注意:联合中的第一个表决定了列名和类型。因此无论如何获取LinqPad都是明智的。

可能是重复的,或者只是编写T-SQL并使用ExecuteQuery()。这真的很糟糕!