从数据表中筛选数据

本文关键字:数据 筛选 数据表 | 更新日期: 2023-09-27 18:16:39

DataTable dtt = (DataTable)Session["ByBrand"];
var filldt = (dtt.Select("Price >= " + HiddenField1.Value + " and Price <= " + HiddenField2.Value + "")).CopyToDataTable();
当在选定的数据表中找到值时,

此代码工作正常,但是当在数据表中找不到值时,它会显示错误。因此,请告诉我如何检查是否未找到记录。

从数据表中筛选数据

只需检查您的选择是否返回任何内容?

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

好吧,Tim 的 Linq 示例非常好,但要完成我的答案。如果未选择任何行,Select 方法也会返回 Always a DataRow 数组,但随后您不能要求从此空数组生成数据表。想想吧。如果数组中不存在行,CopyToDataTable 应为生成的表构建什么架构?

您已经标记了 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();
}

或者这种方法可能更有效,因为它不需要使用Any在最坏的情况下可能会导致额外的完整枚举:

foreach(DataRow row in filteredRows)
{
    tblFiltered.ImportRow(row);
}
相关文章: