2013-06-03 107 views
3
DataTable dtt = (DataTable)Session["ByBrand"]; 
var filldt = (dtt.Select("Price >= " + HiddenField1.Value + " and Price <= " + HiddenField2.Value + "")).CopyToDataTable(); 

當代碼在選定的DataTable中找到值時,此代碼正常工作,但在DataTable中找不到值時顯示錯誤。所以請告訴我如何檢查是否沒有記錄。從DataTable中篩選數據

+0

你得到什麼錯誤?看起來像'CopyToDataTable()'擴展方法應該返回一個空的'DataTable',即使結果是空的而不是錯誤的。 – Ocelot20

回答

4

只需檢查您的選擇是否返回任何內容?

DataTable dtt = (DataTable)Session["ByBrand"]; 
DataRow[] rows = dtt.Select("Price >= " + HiddenField1.Value + " and Price <= " + HiddenField2.Value + ""); 
if(rows.Length > 0) 
{ 
    var filldt = rows.CopyToDataTable(); 
} 

那麼,蒂姆的Linq例子真的很好,但要完成我的答案。 如果沒有選定行,Select方法也會返回AlwaysRate DataRow數組,但是您不能要求從此空數組構建數據表。想想看。如果數組中沒有行,CopyToDataTable應該爲結果表構建什麼樣的模式?

+0

謝謝,它適用於我 –

5

已標記爲Linq但您使用的是DataTable.Select,這是一種老方法來過濾DataTable。使用Enumerable.Where和強類型Field擴展方法。

decimal priceFrom = decimal.Parse(HiddenField1.Value); 
decimal priceTo = decimal.Parse(HiddenField2.Value); 

var dtFiltered = dtt.AsEnumerable() 
    .Where(row => row.Field<decimal>("Price") >= priceFrom 
       && row.Field<decimal>("Price") <= priceTo)) 
    .CopyToDataTable(); 

假定該列的類型是decimal,如果您需要使用在Field或先轉換它不同的類型。

請注意,您需要添加System.Linq(文件)和對System.Data.DataSetExtensions(項目)的引用。

更新

,但它表示在數據表

CopyToDataTable都沒有找到價值觀錯誤,如果輸入序列爲空,拋出一個異常。在我看來,最好的辦法是分別處理這種情況:

DataTable tblFiltered = dtt.Clone(); // clones only structure not data 
var filteredRows = dtt.AsEnumerable() 
    .Where(row => row.Field<decimal>("Price") >= priceFrom 
       && row.Field<decimal>("Price") <= priceTo)); 
if(filteredRows.Any()) 
{ 
    tblFiltered = filteredRows.CopyToDataTable(); 
}