指定演员表无效。 Linq DateTime

时间:2012-07-05 14:04:27

标签: c# linq

当我尝试执行以下查询时,我在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'。任何人都可以帮我解决这个问题。

3 个答案:

答案 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)