LINQ错误无法转换类型&system; system.datetime'输入' system.string'

时间:2015-02-17 07:19:40

标签: linq

我正在执行此代码,我收到错误。

这是在asp脚本中执行的查询。 mydateTime包含date&时间值,所以我使用CAST只获得日期。

SELECT CAST(mydateTime AS DATE) AS getdate FROM vTable

这是代码

var value = (from r in innerdt.AsEnumerable()
           where r.Field<string>("ggg") == dt.Rows[i][5].ToString()
           select r[0]);

这里的内容是Datatable&amp; dt是另一个数据表。我在 选择r [0]

中收到错误

我该如何解决这个问题?

由于

1 个答案:

答案 0 :(得分:1)

您的innerdt表包含DateTime类型的列,但当您通过r.Field<string>("ggg")查询时,您希望将其转换为字符串。

这就是问题所在;方法Field将字段的值强制转换为您指定的类型的值,因此Field方法看起来像:

public TDest Field<TDest>(this DataRow row, string key)
{
    var value = row[key];
    return (TDest)value; // Here it throws the InvalidCastException
}

您需要做的是在从行中获取字符串后将DateTime转换为字符串,如下所示:

var value = (from r in innerdt.AsEnumerable()
             where r.Field<DateTime>("ggg").ToString() == dt.Rows[i][5].ToString()
             select r[0]);

作为旁注,请记住,这会将日期与毫秒进行比较,这可能不是您想要的。要避免这种情况,请使用格式字符串以确保ToString()仅返回您想要的部分或使用ToShortDateString()

修改

正如@sloth建议的那样,更好的方法是将dt.Rows[i][5]转换为DateTime,然后使用Date属性比较对象;此外,您最好将该值存储在变量中,因为您将获得可读性:

var desiredDate = Convert.ToDateTime(td.Rows[i][5]);
var value = (from r in innerdt.AsEnumerable()
             where r.Field<DateTime>("ggg").Date == desiredDate.Date
             select r[0]);