2010-03-07 280 views
2

我有一個我從Excel數據構建的Datable,但有時Excel會返回所有字段爲空的行。如何用linq過濾掉DataTable中的空行?

我想過濾這些通常不考慮列名稱。

我認爲Linq會很好地做到這一點,但有一點麻煩讓這種情況發生。

到目前爲止,這是我得到:

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

但它不能令人信服。任何人都可以看到我錯過了什麼,或者如果我在錯誤的軌道上?

在此先感謝!

回答

4

像這樣:

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

或者,使用查詢理解語法:

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

是不可能確保1列不是像列號2是非空的只是不是空。我的代碼現在是'IEnumerable refIds =(從datarow在dataTable.AsEnumerable() select dataRow.Field (dataColumn.ColumnName));'。當我使用refIds.ToList()時,得到無效的轉換異常。 – Saravanan 2011-10-09 09:43:21

+0

編輯:請注意,IEnumerable是String類型的,我不提取唯一的id,因爲它們不能爲null。 – Saravanan 2011-10-09 09:59:54

3

有點清潔,使用表列:

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

這也會更快。 – SLaks 2010-03-07 16:54:03

+0

我通常做table.OfType ()來定義DataTable並將對象中的行轉換爲DataRow。但是,如果其中一行最終爲空,則不確定行爲。 – Will 2010-03-07 16:55:40

+0

DataTable中不能有空行。並且你不需要'OfType ()',因爲DataTable的項目總是DataRows,所以你可以'Cast ()'(它是相同的,但是不過濾類型) – 2010-03-07 17:09:29

1

感謝您的答覆!在我發佈後,下面這個想法打我,它對我有用:

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