我正在使用以下代码来获取过滤后的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。
我能做到这一点吗?
发布于 2012-02-19 21:14:16
你可以这样做。首先,您需要获取所有行。然后检查检索到的行数。你可以查看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();
}发布于 2012-02-19 21:16:49
这个问题似乎在4.0中被修复了,尽管它没有被标记出来。
在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()
https://stackoverflow.com/questions/9349408
复制相似问题