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

wz1wpwve  于 2023-10-13  发布在  其他
关注(0)|答案(8)|浏览(113)

我有代码:

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

filteredCount = dt.Rows.Count();

当没有匹配的行时,我应该如何最好地处理事件?目前我得到
源不包含数据库
但我想在这种情况下将filteredCount设置为0。
我知道尝试接球很有效,但有更优雅的方法吗?

kq4fsx7k

kq4fsx7k1#

你肯定不想为此使用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;
xwmevbvl

xwmevbvl2#

这个解决方案怎么样:

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是结果表。

jecbmhm3

jecbmhm33#

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

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

cgyqldqp4#

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

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

xwbd5t1u5#

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;
                            }
e3bfsja2

e3bfsja26#

下面的代码为我工作。请尝试

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

slwdgvem7#

可重复使用的通用解决方案:
创建扩展方法:

public static IEnumerable<T> NullIfEmpty<T>(this IEnumerable<T> source) => source.Count() > 0 ? source : null;

现在你可以像这样调用这个扩展方法:

var newTable = dataRows.NullIfEmpty()?.CopyToDataTable();
//Here dataRows can be of any IEnumerable collection such as EnumerableRowCollection<DataRow> in case of DataTable
anauzrmj

anauzrmj8#

可以使用扩展方法Any():在使用CopyToDataTable()之前进行检查,以避免出现未找到数据流异常

IEnumerable<DataRow> result = <<Some Linq Query>>;

        if (result.Any())
        {
             
        }

相关问题