2015-08-24 63 views
1

我想通過過濾現有的DataView來創建一個新的DataView,但是由於DataView沒有.AsEnumerable()方法並且沒有實現IEnumerable {DataRow},所以我遇到了麻煩。C#從DataView創建DataView

這裏基本上是我想要完成的任務:

//Some table. 
DataTable dt = new DataTable(); 

//Somewhere in here the table is given columns and rows... 

//The first view shows some subset of the table. 
//(This works fine.) 
DataView dv1 = dt.AsEnumerable() 
    .Where(r => r.Field<int>("ID") < 1000) 
    .AsDataView(); 

//The second view should show a subset of the first view, but I cannot find the methods to do this. 
//(This does not compile.) 
DataView dv2 = dv1.AsEnumerable() 
    .Where(r => r.Field<int>("Salary") > 50000) 
    .AsDataView(); 

我想出迄今最好的事情是

DataView dv2 = dv1.ToDataTable().AsEnumerable() 
    .Where(r => r.Field<int>("Salary") > 50000) 
    .AsDataView(); 

這是醜陋,我猜效率低下。

從視圖中製作視圖的最佳方式是什麼?

+0

也可能是你問的問題薪水「)> 50000' – Jonesopolis

+0

謝謝瓊斯波利斯,這是我把一些實際上沒有從源代碼文件中複製過來的示例代碼拼湊在一起的疏忽。 – JamesFaix

回答

2

在一個單獨的IEnumerable創建第一個過濾器,然後用它來創建這兩個數據視圖:一個字符串是否是比`r.Field (整數更大的」

var filtered = dt.AsEnumerable() 
       .Where(r => r.Field<int>("ID") < 1000); 


DataView dv1 = filtered.AsDataView(); 

DataView dv2 = filtered.Where(r => r.Field<string>("Salary") > 50000) 
         .AsDataView();