DataTable dtt = (DataTable)Session["ByBrand"];
var filldt = (dtt.Select("Price >= " + HiddenField1.Value + " and Price <= " + HiddenField2.Value + "")).CopyToDataTable();
此代码在选定的DataTable中找到值时工作正常,但在DataTable中找不到值时显示错误。所以请告诉我如何检查是否找不到记录。
答案 0 :(得分:6)
您已标记 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
(项目)的引用。
更新
如果输入序列为空,但在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);
}
答案 1 :(得分:5)
只需检查您的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 a DataRow数组,但是你不能要求从这个空数组中构建数据表。想一想。如果数组中没有行,那么CopyToDataTable应该为结果表构建什么模式?