列が. _ 実際には、その列に日付の文字列表現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
、説明したメッセージで例外がスローされます。
修正する方法は 2 つあります。
私がお勧めするのは、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;