2011-07-22 2 views
3

Cela fonctionne:Nourrir un LINQ résultat dans un DataRow

var Result = from e in actual.Elements 
         select new 
         { 
          Key = e.Key, 
          ValueNumber = e.Value.ValueNumber, 
          ValueString = e.Value.ValueString, 
          ValueBinary = e.Value.ValueBinary, 
          ValueDateTime = e.Value.ValueDateTime 
         }; 

Mais cela ne fonctionne pas:

IEnumerable<DataRow> Result = from e in actual.Elements 
       select new DataRow 
       { 
        Key = e.Key, 
        ValueNumber = e.Value.ValueNumber, 
        ValueString = e.Value.ValueString, 
        ValueBinary = e.Value.ValueBinary, 
        ValueDateTime = e.Value.ValueDateTime 
       }; 

DataTable dt = Result.CopyToDataTable(Result); 

Pouvez-vous fixer pour moi? Je veux que le deuxième bit de code fonctionne pour que je puisse le mettre dans le DataTable. Je me rends compte que la syntaxe est totalement fausse dans # 2. Comment spécifiez-vous une colonne en utilisant LINQ comme ça?

+0

Qu'est-ce que actual.Elements? Un autre DataTable? – Tim

+0

Elements est un dictionnaire. La partie "clé" est une chaîne. La partie "value" est une classe avec 4 propriétés - ValueNumber, ValueString, ValueBinary, ValueDateTime ... – 010110110101

Répondre

3

vous pouvez écrire une méthode simple d'extension qui prend IEnumerable<T> tout, utilise la réflexion pour obtenir les PropertyDescriptor s associés à T, et crée un DataColumn pour chaque

public static DataTable PropertiesToDataTable(this IEnumerable<T> source) 
{ 
     DataTable dt = new DataTable(); 

     var props = TypeDescriptor.GetProperties(typeof(T)); 

     foreach (PropertyDescriptor prop in props) 
     { 
      DataColumn dc = dt.Columns.Add(prop.Name,prop.PropertyType); 
      dc.Caption = prop.DisplayName; 
      dc.ReadOnly = prop.IsReadOnly; 
     } 

     foreach (T item in source) 
     { 
      DataRow dr = dt.Rows.NewRow(); 
      foreach (PropertyDescriptor prop in props) 
       dr[prop.Name] = prop.GetValue(item); 

      dt.Rows.Add(dr); 
     } 

     return dt;  
} 
0

Vous pourriez vouloir regarder dans le DataTableExtensions.AsEnumerable Method

Je ne l'ai pas testé, mais cela pourrait se vous l'avez fait dans la bonne direction:

IEnumerable<DataRow> result = (from e in actual.Elements 
           select new DataRow 
           { 
            Key = e.Key, 
            ValueNumber = e.Value.ValueNumber, 
            ValueString = e.Value.ValueString, 
            ValueBinary = e.Value.ValueBinary, 
            ValueDateTime = e.Value.ValueDateTime 
           }).AsEnumerable(); 

DataTable dt = Result.CopyToDataTable(Result); 
+0

Non, cela ne fonctionne pas. Il génère une erreur de compilation DataRow est inaccessible en raison du niveau de protection. Comment résoudre celui-là? –

Questions connexes