繁体   English   中英

从数据表中过滤数据

[英]Filter data from DataTable

DataTable dtt = (DataTable)Session["ByBrand"];
var filldt = (dtt.Select("Price >= " + HiddenField1.Value + " and Price <= " + HiddenField2.Value + "")).CopyToDataTable();

此代码在选定的DataTable中找到值时工作正常,但在DataTable中未找到值时显示错误。 因此,请告诉我如何检查是否找不到记录。

您已经标记了Linq,但是使用的是DataTable.Select ,这是一种过滤DataTable的旧方法。 使用Enumerable.Where和Strongyl类型的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 (项目)的引用。

更新资料

但是在DataTable中找不到值时显示错误

如果输入序列为空,则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);
}

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

 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 DataRow数组,但是您不能要求从此空数组构建数据表。 想一想。 如果数组中没有行,则应为结果表构建哪种模式的CopyToDataTable?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM