我运行以下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中:
我也尝试过:
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();
但我仍然遇到同样的错误
答案 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)
。值得检查一下这是否会导致任何并发症。
对于其他读者:您还需要:
此外,这里有一个列表,其中包含支持并转换为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日期和时间类型的其他注意事项。