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

ご覧のとおり、 として保存されているフィールドを読み取ろうとして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;
于 2012-07-05T15:27:47.053 に答える
0

列が null 可能かどうかを確認します。その場合は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 に答える