2017-09-26 11 views
1

ラムダを使用してDataTableオブジェクトを解析する際に、次のコードで何が問題になるかはわかりません。Datetime C#ラムダ解析のための "指定されたキャストが有効ではありません"

List<ApprovalPCNReportViewModel> report = GetApprovalPCNReport().AsEnumerable().Select(m => new ApprovalPCNReportViewModel() 
     { 
      PCNNotificationNumber = m.Field<String>("NotifiDocNumber"), 
      CreatedDate = m.Field<DateTime>("CreatedDate"), 
      EmailRecipients = m.Field<String>("EmailRecipients"), 
      EmailSentDate = m.Field<DateTime>("EmailSentDate"), 
      EmailOpenedDate = m.Field<DateTime>("EmailOpenedDate"), 
      MailFrequency = m.Field<int>("MailFrequency"), 
      ApprovedDate = m.Field<DateTime>("ApprovedDate"), 
      ApprovedBy = m.Field<String>("ApprovedBy") 
}).ToList(); 

結合のDataTable - The DataTable values enter image description here

ビューモデル(ApprovalPCNReportViewModel) - -

public String PCNNotificationNumber { get; set; } 
public DateTime? CreatedDate { get; set; } 
public String EmailRecipients { get; set; } 
public DateTime EmailSentDate { get; set; } 
public DateTime EmailOpenedDate { get; set; } 
public Int32 MailFrequency { get; set; } 
public DateTime ApprovedDate { get; set; } 
public String ApprovedBy { get; set; } 

私はかなり確信している

public DataTable GetApprovalPCNReport() 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("NotifiDocNumber"); 
     dt.Columns.Add("CreatedDate"); 
     dt.Columns.Add("EmailRecipients"); 
     dt.Columns.Add("EmailSentDate"); 
     dt.Columns.Add("EmailOpenedDate"); 
     dt.Columns.Add("MailFrequency"); 
     dt.Columns.Add("ApprovedDate"); 
     dt.Columns.Add("ApprovedBy"); 
     for (int i = 0; i < 100; i++) 
     { 
      DataRow dr = dt.NewRow(); 
      dr["NotifiDocNumber"] = "Column1 - Row " + i; 
      dr["CreatedDate"] = DateTime.Now; 
      dr["EmailRecipients"] = "Column3 - Row " + i; 
      dr["EmailSentDate"] = DateTime.Now; 
      dr["EmailOpenedDate"] = DateTime.Now; 
      dr["MailFrequency"] = i; 
      dr["ApprovedDate"] = DateTime.Now; 
      dr["ApprovedBy"] = "Column6 - Row " + i; 
      dt.Rows.Add(dr); 
     } 
     return dt; 
    } 

ここでは、データがありますDateTimeとIntで無効なキャスト例外が発生しています。どこが間違っていたのか?コメントする

+0

あなたは 'CreatedDate = m.Field (" CreatedDate ")'を試しましたか? 'DateTime?'は 'DateTime'と同じではないことに注意してください。 –

+0

@ TetsuyaYamamoto「DateTime?」を「DateTime」に設定することができます(http://share.linqpad.net/f9445g.linq)。 –

+0

'DataTable'のすべてのフィールドは、実際にフィールドから取り出そうとしているデータ型と一致していますか?すなわち、 'CreatedDate' *は本当に' DateTime'であり、 'DateTime'のように見える' string'ではありませんか? –

答えて

1

が足りませんcredsを - ので、この過負荷に

スイッチ:DataColumnCollection.Add (String, Type)と明示的

をタイプを指定Addあなたが使用するには、私に語った:デフォルトでは

、データ型を新しい列は文字列です。

これで問題が解決するはずです。

+0

ありがとう!出来た。 @ブラッドリーUffnerにも感謝します。 – AdityaRao

関連する問題