2011-10-27 35 views
2

我有以下三张表,需要从两个不相似的表中引入信息。使用C#Linq的错误SQL CONCAT

  • 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(); 

查询编译成功,但是当SQL调用期间执行以Count(),我得到一个错误

所有查询使用UNION合并,交叉或EXCEPT运算符必须有同等数量的的表达式在他们的目标列表中。

显然每两个列表有三个项目,其中之一是一个常数。其他帮助委员会建议Visual Studio 2010 C#编译器正在优化常量,并且我已经尝试了常量的替代方法。

最令人惊讶的是,如果select new {...}Time=条目都子查询已被注释掉,在SQL执行时发生错误。

+0

尝试更改'Time = String.Format(“{0:hh:mm:ss}”,hs.Time)'到'Time =“foo”' –

回答

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 = "" 
         }); 

之后,你总是可以循环槽的进度和时间格式,以您的需求。