1

当我尝试执行以下查询时,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'。谁能帮我解决这个问题。

4

3 回答 3

2

我称您声称该列存储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

因此,您应该能够看到,当您尝试读取存储为 a的字段string但您尝试将其作为 a 访问时DateTime,它会抛出您刚刚描述的消息的异常。


有两种方法可以解决它。

我建议更改列上的类型,使其适用于DateTime对象并实际存储DateTime值。不,字符串表示将不起作用。然后,您的查询将按照您的预期工作,无需额外更改。

否则,请更改您的查询,以便您使用正确的类型 (a 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;
于 2012-07-05T15:27:47.053 回答
0

检查列是否可以为空。如果是这样,请a.Field<DateTime?>("StartDate")改用。

于 2012-07-05T14:19:24.887 回答
-1

不是一个确切的回应,但:

var query = from a in dt.AsEnumerable()
            where 
                a.StartDate > DateTime.Now
            select a;

应该运行(假设 s.StartDate 是 DateTime)

于 2012-07-05T14:12:59.920 回答