DataTable RowFilter避免Source包含没有数据行的异常

时间:2012-02-19 13:07:53

标签: asp.net datatable

使用以下代码获取过滤后的DataTable

DT = NewMobileFa.GetNewMobile().AsEnumerable().Where(r => arrList.Contains(r.Field<int>("NewMobileID")) && r.Field<string>("Status") == "OF").CopyToDataTable(); 

这段代码给了我错误

Source contains no data rows

这是正确的,实际上没有数据

我需要的是,如果没有数据行并且只返回空的DataSource,我需要避免异常。

我可以实现吗?

2 个答案:

答案 0 :(得分:0)

你可以这样做。首先你需要得到所有的行。然后检查已重试行的计数。你可以查看MSDN DataTable.CopyToDataTable,它有很好的解释

var Rows = NewMobileFa.GetNewMobile().AsEnumerable().Where(r => arrList.Contains(r.Field<int>("NewMobileID")) && r.Field<string>("Status") == "OF");

现在使用行来检查数据是否存在

if(Rows.Count()>0)
{
   DataTable dt = Rows.CopyToDataTable(); 
}

答案 1 :(得分:0)

这个问题似乎在4.0中得到修复,尽管它没有标记。

https://connect.microsoft.com/VisualStudio/feedback/details/422727/major-flaw-in-system-data-datatableextensions-copytodatatable-design

对4.0的快速测试按预期工作:

tbl.AsEnumerable().Where(r=>1==2).CopyToDataTable();

无论源DataTable是否为空,它都会成功创建一个包含0行的DataTable。

如果您使用的是旧版本的.NET框架,请使用其中一个重载,例如CopyToDataTable(IEnumerable, DataTable, LoadOption),如果源DataTable中没有行,则不会抛出异常。

或者使用以下建议的方法之一:

How to deal with a flaw in System.Data.DataTableExtensions.CopyToDataTable()