2010-03-07 5 views
2

J'ai une Datable que j'ai construite à partir de données Excel, mais parfois Excel renvoie des lignes dans lesquelles tous les champs sont Null.Comment filtrer les lignes nulles de DataTable avec linq?

J'aimerais les filtrer génériquement sans tenir compte des noms de colonnes.

Je pense que Linq le ferait très bien, mais qu'il aurait un peu de mal à faire en sorte que cela se produise.

Jusqu'à présent, ce que je suis:

var nonemptyrows = from r in table.AsEnumerable() 
               from f in r.ItemArray 
                where f != null 
                select r; 

Mais ce n'est pas tout à fait là. Quelqu'un voit-il ce qui me manque ou si je suis sur la mauvaise piste?

Merci d'avance!

Répondre

4

Comme ceci:

table.AsEnumerable() 
    .Where(r => r.ItemArray.Any(v => v != null && v != DBNull.Value)) 

Ou, en utilisant la syntaxe de compréhension de la requête:

from r in table.AsEnumerable() 
where r.ItemArray.Any(v => v != null && v != DBNull.Value) 
+0

Il n'est pas possible de s'assurer que 1 colonne seule n'est pas nulle comme la colonne numéro 2 n'est pas nulle. Mon code est maintenant 'IEnumerable refIds = (à partir de datarow dans dataTable.AsEnumerable() sélectionnez dataRow.Field (dataColumn.ColumnName));'. Où j'obtiens l'exception de cast invalide quand j'utilise refIds.ToList(). – Saravanan

+0

Edit: Veuillez noter que IEnumerable est de type String et que je ne récupère pas d'identifiants uniques, car ils ne peuvent pas être null. – Saravanan

3

Un peu plus propre, en utilisant les colonnes de la table:

var nonemptyrows = from row in table.AsEnumerable() 
        where table.Columns.Any(col => !row.IsNull(col)) 
        select row; 
+0

Ce sera également plus rapide. – SLaks

+0

Habituellement, je fais table.OfType () à la fois linquify le DataTable et transtyper les lignes de l'objet à DataRow. Pas sûr que le comportement si l'une des lignes finit par être nulle, cependant. – Will

+0

Il ne peut pas y avoir de ligne nulle dans un DataTable. Et vous n'avez pas besoin de 'OfType ()', puisque les éléments d'un DataTable sont toujours DataRows, donc vous pouvez juste 'Cast ()' (qui est le même mais ne filtre pas sur le type) –

1

Merci pour votre réponse! juste après que j'ai posté, cette idée ci-dessous m'a frappé et cela a fonctionné pour moi:

var nonemptyrows = from r in table.Rows.Cast<DataRow>() where r.ItemArray.All(c => c != DBNull.Value) select r; 
Questions connexes