2010-08-18 7 views

Répondre

2

Non il n'y a aucun moyen de le créer sans en incrémentant à travers chaque élément. L'expression Linq est évaluée en cas de besoin afin qu'elle passe par chaque ligne (pour la correspondance et la sélection).

Je pense que vous devriez essayer d'utiliser DataTable.Select() (MSDN link) méthode plutôt qu'il retourne un tableau de DataRow objets que vous pouvez ajouter à la nouvelle table comme suit:

var rows = [ORIGINAL DATA TABLE].Select("id>5"); 

var dtb=[ORIGINAL DATA TABLE].Clone(); 

foreach(DataRow r in rows) 
{ 
    var newRow = dtb.NewRow(); 
    newRow.ItemArray = r.ItemArray; 
    dtb.Rows.Add(newRow);//I'm doubtful if you need to call this or not 
} 
5

Crédit this blogger, mais je me suis amélioré sur son algorithme ici. Faites-vous une méthode d'extension:

public static DataTable ToADOTable<T>(this IEnumerable<T> varlist) 
    { 
     DataTable dtReturn = new DataTable(); 
     // Use reflection to get property names, to create table 
     // column names 
     PropertyInfo[] oProps = typeof(T).GetProperties(); 
     foreach (PropertyInfo pi in oProps) 
     { 
      Type colType = pi.PropertyType; 
      if ((colType.IsGenericType) && (colType.GetGenericTypeDefinition() == typeof(Nullable<>))) 
       colType = colType.GetGenericArguments()[0]; 
      dtReturn.Columns.Add(new DataColumn(pi.Name, colType)); 
     } 
     foreach (T rec in varlist) 
     { 
      DataRow dr = dtReturn.NewRow(); 
      foreach (PropertyInfo pi in oProps) 
       dr[pi.Name] = pi.GetValue(rec, null) == null ? DBNull.Value : pi.GetValue(rec, null); 
      dtReturn.Rows.Add(dr); 
     } 

     return (dtReturn); 
    } 

Utilisation:

DataTable dt = query.ToADOTable(); 
+0

Je reçois cette erreur lorsque vous utilisez votre code: « CS0121: L'appel est ambigu entre les méthodes ou les propriétés suivantes: "Savez-vous comment résoudre ceci? Merci pour le code cependant, +1 – Phil

+0

@Phil - ne peut pas dire à moins que vous postez le texte d'erreur complet, qui devrait contenir une référence aux deux méthodes concurrentes. Ensuite, vous saurez quelle autre méthode a la même signature. –

+0

C'est la chose ... c'est la même signature pour eux deux. Vraiment étrange! Quoi qu'il en soit, voici la signature, quelques noms en suédois. Si vous ne savez pas directement, je vais juste poster une question à ce sujet. Message d'erreur: CS0121: L'appel est ambigu entre les méthodes ou propriétés suivantes: 'Gruppkoll.App_Code.ConvertToDataTableFromLinqResult.ToADOTable (System.Collections.Generic.IEnumerable )' et 'Gruppkoll.App_Code. ConvertToDataTableFromLinqResult.ToADOTable (System.Collections.Generic.IEnumerable ) ' – Phil

Questions connexes