[英]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.