2012-07-05 179 views
1

當我嘗試執行下面的查詢時,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'。任何人都可以幫助我解決這個問題。

+2

該字段實際存儲爲DateTime對象還是字符串?在我看來,這是一個字符串。 – 2012-07-05 14:12:18

+0

這是一種DateTime。 – Pradeep 2012-07-05 14:14:14

+0

不要投,解析 – Jodrell 2012-07-05 14:14:51

回答

1

我打電話給shenanigans,聲稱該列是存儲作爲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值。不,字符串表示不起作用。然後,您的查詢將按照您預期的方式工作,而無需進行其他更改。

否則,請更改您的查詢,以便使用正確的類型(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; 
-1

不是一個確切的反應,但:

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

應該運行(假定s.StartDate是一個DateTime)

+0

根據用法,'dt'最可能是'DataTable'。您將無法以這種方式訪問​​這些字段。 – 2012-07-05 15:37:51

0

檢查列可以爲空。如果是這樣,請使用a.Field<DateTime?>("StartDate")