【问题标题】:Error from use of C# Linq SQL CONCAT使用 C# Linq SQL CONCAT 时出错
【发布时间】:2011-10-27 17:37:58
【问题描述】:

我有以下三个表,需要从两个不同的表中引入信息。

  • baTable 具有字段OrderNumberPosition
  • accessTable 具有字段 OrderNumberProcessSequence(以及其他)
  • historyTable 具有字段OrderNumberTime(以及其他)。

.

var progress = from ba in baTable                                   
           from ac in accessTable
           where ac.OrderNumber == ba.OrderNumber
           select new {
                Position = ba.Position.ToString(),
                Time = "", 
                Seq = ac.ProcessSequence.ToString()
           };
progress = progress.Concat(from ba in baTable
                       from hs in historyTable
                       where hs.OrderNumber == ba.OrderNumber
                       select new {
                           Position = ba.Position.ToString(),
                           Time = String.Format("{0:hh:mm:ss}", hs.Time),
                           Seq = ""
                       });
int searchRecs = progress.Count();

查询编译成功,但是在调用Count()期间执行SQL时出现错误

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

显然,这两个列表各有三项,其中一项是常数。其他帮助板建议 Visual Studio 2010 C# 编译器正在优化常量,我已经尝试了常量的替代方案。

最令人惊讶的是,如果select new {...}中的Time=条目在两个子查询中都被注释掉了,SQL执行时不会出错。

【问题讨论】:

  • 尝试将Time = String.Format("{0:hh:mm:ss}", hs.Time)更改为Time = "foo"

标签: c# linq-to-sql concat


【解决方案1】:

我实际上认为问题在于 Sql 无法识别您的 String.Format(..) 方法。

将您的第二个查询更改为:

progress = progress.Concat(from ba in baTable
                       from hs in historyTable
                       where hs.OrderNumber == ba.OrderNumber
                       select new {
                           Position = ba.Position.ToString(),
                           Time = hs.Time.ToString(),
                           Seq = ""
                       });

之后,您可以随时循环浏览进度并根据需要设置时间格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多