当我尝试执行以下查询时,我在Linq中有“指定的强制转换无效”错误消息。
var query = from a in dt.AsEnumerable()
where SqlMethods.DateDiffDay(TimeZone.CurrentTimeZone.ToLocalTime(a.Field<DateTime>("StartDate")), DateTime.Now) >= 0
select a;
我的StartDate为'1997-10-01T00:00:00'。任何人都可以帮我解决这个问题。
答案 0 :(得分:1)
我将您的声明称为存储作为DateTime
的恶作剧。我敢打赌,你实际上是在该列中存储日期的字符串表示。
为了演示,这里有一个简单的例子,说明你会得到什么例外(如果有的话)。
var dt = new DataTable();
dt.Columns.Add("AsString", typeof(string));
dt.Columns.Add("AsDateTime", typeof(DateTime));
var now = DateTime.Now;
var row = dt.Rows.Add(now.ToString(), now);
row.Field<string>("AsString"); // this is fine
row.Field<string>("AsDateTime"); // InvalidCastException: Unable to cast object of type 'System.DateTime' to type 'System.String'.
row.Field<DateTime>("AsString"); // InvalidCastException: Specified cast is not valid.
row.Field<DateTime>("AsDateTime"); // this is fine
DateTime.Parse(row.Field<string>("AsString")); // this is fine
因此,当您尝试将存储字段作为string
读取时,您应该能够看到,但是您尝试将其作为DateTime
进行访问,使用您刚才描述的消息抛出异常。
有两种方法可以解决它。
我建议更改列上的类型,以便DateTime
个对象实际存储DateTime
值。不,字符串表示不起作用。然后,您的查询将按预期工作,无需任何其他更改。
否则,更改您的查询,以便您使用正确的类型(string
)访问该字段,将其解析回DateTime
对象并从那里开始。
var now = DateTime.Now;
var query =
from row in dt.AsEnumerable()
let startDate = DateTime.Parse(row.Field<string>("StartDate"))
where SqlMethods.DateDiffDay(
TimeZone.CurrentTimeZone.ToLocalTime(startDate),
now) >= 0
select row;
答案 1 :(得分:0)
检查列是否可为空。如果是,请改用a.Field<DateTime?>("StartDate")
。
答案 2 :(得分:-1)
不是确切的答案,但是:
var query = from a in dt.AsEnumerable()
where
a.StartDate > DateTime.Now
select a;
应该运行(假设s.StartDate是一个DateTime)