我有代码:
dt = collListItems.GetDataTable().AsEnumerable()
.Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office)
.CopyToDataTable();
filteredCount = dt.Rows.Count();
当没有匹配的行时,我应该如何最好地处理事件?目前我得到“源包含没有DataRows”但我想在这种情况下将filteredCount设置为0。
提前致谢。
编辑:我知道try..catch有效,但有更优雅的方式吗?
答案 0 :(得分:70)
你当然不想使用try / catch。 Try / Catch应该在真正特殊情况下使用,你不想让它驱动你的控制流程。几乎在所有情况下,都有更好的方法可以直接构建到语言/库中,或者只需要很少的代码就可以进行编码。
在这种情况下,您希望事先捕获表,这样您就不会多次调用GetDataTable()
方法,因为如果查询不包含任何结果,我们将需要它。如果查询本身很昂贵或长时间运行,您还可以选择在查询中包含ToList()
,因此您只需要执行一次。
之后,测试结果中是否有任何行是一个问题。如果是这样,您可以安全地复制到数据表。否则,只需克隆原始表的结构(不包括行),这样在任何一种情况下,您都有一个正确的表结构,可以检查行数,将其绑定到控件,等等,并没有什么惊喜。
var table = collListItems.GetDataTable();
var rows = table.AsEnumerable().Where(...); // optionally include .ToList();
var dt = rows.Any() ? rows.CopyToDataTable() : table.Clone();
int filteredCount = dt.Rows.Count;
答案 1 :(得分:0)
您可以先判断是否有匹配的行:
var rows = collListItems.GetDataTable().AsEnumerable()
.Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office);
DataTable dt = table.Clone();
if (rows.Count() > 0)
dt = rows.CopyToDataTable();
答案 2 :(得分:0)
我认为这是一个更简单的解决方案:
var Adj = (from c in View.AdjustmentsDataSource.AsEnumerable()
where c["Adjustment"] != System.DBNull.Value
select c);
if (Adj == null || Adj.Count() == 0)
return;
DataTable dtChanges = Adj.CopyToDataTable();
答案 3 :(得分:0)
var results = from myRow in dtL1Users.AsEnumerable()
where (Convert.ToInt32(myRow["No_x0020_of_x0020_L1_x0020_Remin"]) >= Convert.ToInt32(maxL1Escalation) && Convert.ToDateTime(myRow["L2_x0020_Last_x0020_Escalated_x0"]) < DateTime.Now.Date.AddDays(-Convert.ToInt32(reminderinterval)))
select myRow;
foreach (var v in results)
{
collEligible = results.CopyToDataTable<DataRow>();
break;
}
答案 4 :(得分:0)
这个解决方案怎么样:
DataRow[] filtered_rows = data.Tables[0].Select(filter_string);
if(filtered_rows.Length > 0)
{
filtered_data = filtered_rows.CopyToDataTable();
}
else
{
filtered_data.Clear();
}
data.Tables[0]
是源表,filtered_data
是结果表。
答案 5 :(得分:0)
下面的代码适合我。请尝试
fs