1

我已经定义了以下模型

  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 表达式填充列表:

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?

问题是在运行时我收到一个错误Value has no literal in 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 类实例的正确方法是什么?

4

1 回答 1

1

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

您可以通过在选择之前使用 a 评估查询并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 });
于 2012-08-31T08:09:36.660 回答