2017-09-26 1 views
1

Lors de l'analyse d'un objet DataTable à l'aide de Lambda, je ne vois pas ce qui ne va pas dans le code suivant.La distribution spécifiée n'est pas valide pour l'analyse lambda 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 reliure -

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; 
    } 

Voici les données - The DataTable values enter image description here

Le modèle de vue (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; } 

Je suis assez sûr l'exception de transtypage incorrect est en cours sur DateTime et Int. Une idée d'où je me suis trompé?

+0

Avez-vous essayé 'CreatedDate = m.Field (" CreatedDate ")'? Notez que 'DateTime?' N'est pas la même chose que 'DateTime'. –

+0

@TetsuyaYamamoto Je * pense * que cela devrait être correct, car vous êtes [autorisé] (http://share.linqpad.net/f9445g.linq) pour définir un 'DateTime?' À un 'DateTime'. –

+0

Tous les champs de 'DataTable' correspondent-ils réellement au type de données que vous essayez de retirer du champ? c'est à dire. Est-ce que 'CreatedDate' * est vraiment * un' DateTime' et pas un 'string' qui ressemble à un' DateTime'? –

Répondre

1

Pas assez creds pour commenter - donc:

Passer à cette surcharge: DataColumnCollection.Add (String, Type) et spécifier le type explicitement

Le Add que vous avez utilisé me dit:

Par défaut, le type de données la nouvelle colonne est une chaîne.

Cela devrait résoudre votre problème.

+0

Merci! Ça a marché. Merci à @Bradley Uffner aussi. – AdityaRao