我有代码:
dt = collListItems.GetDataTable().AsEnumerable()
.Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office)
.CopyToDataTable();
filteredCount = dt.Rows.Count();
当没有匹配的行时,我应该如何最好地处理事件?目前我得到
源不包含数据库
但我想在这种情况下将filteredCount设置为0。
我知道尝试接球很有效,但有更优雅的方法吗?
8条答案
按热度按时间kq4fsx7k1#
你肯定不想为此使用try/catch。Try/Catch应该在真正特殊的情况下使用,你不想让它驱动你的控制流。在几乎所有的情况下,都有更好的方法内置在语言/库中,或者只需要最少的代码工作。
在本例中,您希望预先捕获表,这样就不会调用
GetDataTable()
方法超过必要的次数,因为如果查询不包括任何结果,我们将需要它。如果查询本身开销很大或运行时间很长,您还可以选择在查询中包含ToList()
,因此只需执行一次。然后,测试结果中是否有 * 任何 * 行。如果是这样,您可以安全地复制到数据表。否则,只需克隆 * 原始 * 表的结构(不包括行),这样在任何情况下,您都有一个正确的表结构,可以检查行计数,将其绑定到控件等,并且没有意外。
xwmevbvl2#
这个解决方案怎么样:
data.Tables[0]
是源表,filtered_data
是结果表。jecbmhm33#
你可以先判断是否有匹配的行:
cgyqldqp4#
我认为这是一个更简单的解决方案:
xwbd5t1u5#
e3bfsja26#
下面的代码为我工作。请尝试
slwdgvem7#
可重复使用的通用解决方案:
创建扩展方法:
现在你可以像这样调用这个扩展方法:
anauzrmj8#
可以使用扩展方法Any():在使用CopyToDataTable()之前进行检查,以避免出现未找到数据流异常