我定义了以下模型
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类实例的正确方法是什么?
答案 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 });