C# 没有行时如何处理CopyToDataTable()?

C# 没有行时如何处理CopyToDataTable()?,c#,C#,我有密码: dt = collListItems.GetDataTable().AsEnumerable() .Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office) .CopyToDataTable(); filteredCount = dt.Rows.Count(); 当没

我有密码:

dt = collListItems.GetDataTable().AsEnumerable()
        .Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office)
         .CopyToDataTable(); 

filteredCount = dt.Rows.Count();
当没有匹配的行时,如何最好地处理事件?目前我得到“源不包含数据行”,但我想在这种情况下将filteredCount设置为0

提前谢谢


编辑:我知道一个try..catch可以工作,但是有没有更优雅的方法?

您可以首先判断是否有匹配的行:

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();

您当然不想为此使用try/catch。Try/Catch应该在真正特殊的情况下使用,因为您不想让它驱动您的控制流。在几乎所有情况下,都有更好的方法直接构建到语言/库中,或者只需要很少的代码编写工作

在本例中,您希望事先捕获表,这样就不会调用
GetDataTable()
方法超过需要的次数,因为如果查询不包含任何结果,我们将需要它。如果查询本身很昂贵或运行时间很长,您还可以选择在查询中包含
ToList()
,因此只需执行一次

之后,需要测试结果中是否有行。如果是这样,您可以安全地复制到datatable。否则,只需克隆原始表的结构(不包括行),这样无论哪种情况,您都有一个正确的表结构,可以检查行数,将其绑定到控件,等等,这样就不会有任何意外

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;

我认为这是一个更简单的解决方案:

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();
var results=来自dtL1Users.AsEnumerable()中的myRow
其中(Convert.ToInt32(myRow[“No_x0020_of_x0020_L1_x0020_Remin”])>=Convert.ToInt32(maxl1升级)和Convert.ToDateTime(myRow[“L2_x0020_Last_x0020_升级_x0”])
这个解决方案怎么样:

            DataRow[] filtered_rows = data.Tables[0].Select(filter_string);

            if(filtered_rows.Length > 0)
            {
                filtered_data = filtered_rows.CopyToDataTable();
            }
            else
            {
                filtered_data.Clear();
            }

数据。表[0]
是源表,
过滤的数据
是结果表。

下面的代码对我有用。请试一试

 DataRow []dataRow = dataTable.Select(query, seq);
 if (dataRow != null && dataRow.Length > 0)
 {
     return dataTable.Select(query, seq).CopyToDataTable();                                            
 }  

你能发布stacktrace吗?
GetDataTable()
昂贵吗(调用数据库、web服务等)?您是只对计数感兴趣还是也需要数据?它不贵,最多70-90行,不经常使用,我需要数据(如果有)和计数。如果FilterIngnity解决方案后至少剩下一行,则可以正常工作。感谢您的返回语句建议可能会变得难看的非确定性编码样式。
 DataRow []dataRow = dataTable.Select(query, seq);
 if (dataRow != null && dataRow.Length > 0)
 {
     return dataTable.Select(query, seq).CopyToDataTable();                                            
 }