使用TimeSpan转换LINQ查询时出错?到列表<>?

时间:2015-05-05 06:36:24

标签: c# list linq-to-sql nullable timespan

我运行以下LINQ to SQL查询

var q =
    from O in db.GetTable<OptionsTraded>()
    where O.TradeDate.Date == dtpVolReport.Value.Date
    select new { O.TradeTime };

但是当我尝试将此输出转换为列表时:

var qq = q.ToList();

我收到错误:

  

未处理的类型&#39; System.InvalidCastException&#39;发生了   在System.Data.dll中附加信息:指定的强制转换不是   有效的。

我在选择O.TradeTime属性时只会遇到此错误,并且这会映射到类型为TimeSpan?的属性,并且我确定这是问题的路径。如果我尝试在表格中选择任何其他属性,请包括那些映射到其他可空类型的属性,例如int?double?我没有收到错误。

之前是否有人遇到此问题,或者可以建议处理TimeSpan?的正确方法是什么?

这是OptionsTraded的定义方式:

[Table(Name = "OptionsTraded")]
    public class OptionsTraded
    {
        private DateTime _TradeDate;
        [Column(Storage = "_TradeDate")]
        public DateTime TradeDate
        {
            get { return this._TradeDate; }
            set { this._TradeDate = value; }
        }

        private TimeSpan? _TradeTime;
        [Column(Storage = "_TradeTime")]
        public TimeSpan? TradeTime
        {
            get { return this._TradeTime; }
            set { this._TradeTime = value; }
        }
        .
        .
        .

在SQL-Server中:

enter image description here

我也尝试过:

public class TradeViewModel
{
    public TimeSpan? TradeTime { get; set; }
}

var q =
    from O in db.GetTable<OptionsTraded>()
    where O.TradeDate.Date == dtpVolReport.Value.Date
    select new TradeViewModel {TradeTime = O.TradeTime};

var qq = q.ToList();

但我仍然遇到同样的错误

1 个答案:

答案 0 :(得分:4)

根据这篇文章(http://blogs.msdn.com/b/sbajaj/archive/2008/05/14/what-s-new-in-linq-to-sql-sp1.aspx),您应该使用此属性

修饰TimeSpan
[Column(CanBeNull = true, DbType = "TIME(7) NULL")]
public TimeSpan? TradeTime 
{
     //...

请注意,您的SQL定义包含time(0)而不是TIME(7)。值得检查一下这是否会导致任何并发症。

对于其他读者:您还需要:

  • .NET 3.5 SP1或更高版本
  • MS SQL 2008 Eninge(明确或定期)

此外,这里有一个列表,其中包含支持并转换为SQL的操作:

https://msdn.microsoft.com/en-us/library/vstudio/bb882662%28v=vs.100%29.aspx

谨防增加和减少:

  

虽然CLR System.TimeSpan类型支持加法和减法,但SQL TIME类型不支持。因此,如果LINQ to SQL查询在映射到SQL TIME类型时尝试加法和减法,则会产生错误。您可以在SQL-CLR类型映射(LINQ to SQL)中找到使用SQL日期和时间类型的其他注意事项。