LINQ to SQL:使用可空的TimeSpan错误“SQL中没有文字:00:00:00”

时间:2012-08-31 07:59:17

标签: c# linq-to-sql

我定义了以下模型

  public class TodayOrder
{
    public string ID_ORIG { get; set; }
    public string PART_ID { get; set; }
    public string PART_DEX { get; set; }
    public double TimeSecs { get; set; }
 }

现在我尝试使用以下Linq表达式填充List:

var todaysOrders = DCC.vw_ORD_GP_volumes_lastSets
 .Where(a => a.ID_ORIG == id_orig.ToUpper() && 
             a.PART_ID == Part.ToUpper())
 .Select(a => 
     new TodayOrder{ 
         ID_ORIG = a.ID_ORIG, 
         PART_ID = a.PART_ID, 
         PART_DEX = a.PART_DEX,  
         TimeSecs = a.ReqTime.GetValueOrDefault().TotalSeconds });

List<TodayOrder> lst = todaysOrders.ToList();

其中ReqTime的类型为TimeSpan?

问题是在运行时我收到错误值在SQL中没有文字:00:00:00 - 看起来TimeSpan存在问题。

 Line 72:                     });
 Line 73:   ERROR>              lst = todaysOrders.ToList();
 Line 74:  
 [InvalidOperationException: Value has no literal in SQL: 00:00:00]
  System.Data.Linq.SqlClient.Visitor.FormatValue(Object value) +584911
  System.Data.Linq.SqlClient.Visitor.VisitValue(SqlValue value) +32

事实上,如果我注释掉行设置属性TimeSecs,一切正常。

实例化TodayOrder类实例的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

问题是Linq-to-Sql将表达式a.ReqTime.GetValueOrDefault().TotalSeconds转换为sql但它失败了。

您可以通过在选择之前使用ToArray()评估查询并在客户端执行选择来解决此问题:

var todaysOrders = DCC.vw_ORD_GP_volumes_lastSets
 .Where(a => a.ID_ORIG == id_orig.ToUpper() && 
             a.PART_ID == Part.ToUpper())
 .ToArray()
 .Select(a => 
     new TodayOrder{ 
         ID_ORIG = a.ID_ORIG, 
         PART_ID = a.PART_ID, 
         PART_DEX = a.PART_DEX,  
         TimeSecs = a.ReqTime.GetValueOrDefault().TotalSeconds });