2013-06-03 112 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(); 
}