2010-07-27 6 views
3

Importer une feuille de calcul J'ai rempli un objet DataTable avec ces données et renvoie les résultats attendus.Convertir DataTable en LINQ: impossible d'interroger plusieurs champs

Toute tentative de mettre cela dans un format que je peux facilement interroger pour rechercher les problèmes que je l'ai fait ce qui suit

public void Something(DataTable dt) 
{ 
    var data = from row in dt.AsEnumerable() 
       select row["Order"].ToString(); 
} 

fonctionne comme prévu de me donner une liste des commandes. Cependant, je ne peux pas ajouter d'autres champs à cet EnumerableRowCollection. Toute tentative d'ajouter d'autres champs comme suit me donne une erreur

public void Something(DataTable dt) 
{ 
    // row["Version"] throws an error on me 
    var data = from row in dt.AsEnumerable() 
       select row["Order"].ToString(), row["Version"].ToString(); 
} 

Erreur: « Une variable locale appelée « ligne » ne peut pas être déclarée dans ce champ, car cela donnerait un sens différent de « rang », qui est déjà utilisé dans Je pense qu'il me faut alias le nom de la colonne, mais je n'ai pas de chance. Qu'est-ce que j'oublie ici?

+0

Il serait vraiment utile si vous postez le * ne * Code plutôt que le code de travail qui ne fait pas ce que vous voulez. –

+0

Était déjà dessus :) – Mohgeroth

+0

Vous utilisez deux fois le nom de variable "row". Peut-être que vous devriez poster un exemple complet du code qui échoue afin que nous puissions vous aider. – sloth

Répondre

4

On dirait que vous écrivez une mauvaise instruction select. Effectuez les opérations suivantes:

public void Something(DataTable dt) 
{ 
    var data = from row in dt.AsEnumerable() 
       select new { 
          Order = row["Order"].ToString(), 
          Something = row["Something"].ToString(), 
          Customer = row["Customer"].ToString(), 
          Address = row["Address"].ToString() 
          }; 
} 

Cela va créer une nouvelle collection d'objets typés que vous Anonymously pouvez parcourir et utiliser au besoin. Gardez à l'esprit, cependant, que vous voulez être en mesure de retourner data de la fonction. Si vous avez besoin de cette fonctionnalité, vous devez créer un type concret à utiliser (à la place des types anonymes).

+0

Ouais j'oubliais les nouveaux mots-clés. Toujours pas habitué à ces délégués anonymes et tout ça, j'ai oublié. Merci! – Mohgeroth

2

Je pense que vous devriez utiliser select nouveau comme cette requête par exemple:

var q = from o in db.Orders 
     where o.Products.ProductName.StartsWith("Asset") && 
       o.PaymentApproved == true 
     select new { name = o.Contacts.FirstName + " " + 
           o.Contacts.LastName, 
        product = o.Products.ProductName, 
        version = o.Products.Version + 
           (o.Products.SubVersion * 0.1) 
        }; 
0

Vous voulez probablement ce qui suit.

var data = from row 
      in dt.AsEnumerable() 
      select new { Order = row["Order"].ToString(), Version = row["Version"].ToString() };