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

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

我有代码:

  1. dt = collListItems.GetDataTable().AsEnumerable()
  2. .Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office)
  3. .CopyToDataTable();
  4. filteredCount = dt.Rows.Count();

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

kq4fsx7k

kq4fsx7k1#

你肯定不想为此使用try/catch。Try/Catch应该在真正特殊的情况下使用,你不想让它驱动你的控制流。在几乎所有的情况下,都有更好的方法内置在语言/库中,或者只需要最少的代码工作。
在本例中,您希望预先捕获表,这样就不会调用GetDataTable()方法超过必要的次数,因为如果查询不包括任何结果,我们将需要它。如果查询本身开销很大或运行时间很长,您还可以选择在查询中包含ToList(),因此只需执行一次。
然后,测试结果中是否有 * 任何 * 行。如果是这样,您可以安全地复制到数据表。否则,只需克隆 * 原始 * 表的结构(不包括行),这样在任何情况下,您都有一个正确的表结构,可以检查行计数,将其绑定到控件等,并且没有意外。

  1. var table = collListItems.GetDataTable();
  2. var rows = table.AsEnumerable().Where(...); // optionally include .ToList();
  3. var dt = rows.Any() ? rows.CopyToDataTable() : table.Clone();
  4. int filteredCount = dt.Rows.Count;
xwmevbvl

xwmevbvl2#

这个解决方案怎么样:

  1. DataRow[] filtered_rows = data.Tables[0].Select(filter_string);
  2. if(filtered_rows.Length > 0)
  3. {
  4. filtered_data = filtered_rows.CopyToDataTable();
  5. }
  6. else
  7. {
  8. filtered_data.Clear();
  9. }

data.Tables[0]是源表,filtered_data是结果表。

jecbmhm3

jecbmhm33#

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

  1. var rows = collListItems.GetDataTable().AsEnumerable()
  2. .Where(a => Convert.ToString(a["Expertise"]).Contains(expertise) && Convert.ToString(a["Office"]) == office);
  3. DataTable dt = table.Clone();
  4. if (rows.Count() > 0)
  5. dt = rows.CopyToDataTable();
cgyqldqp

cgyqldqp4#

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

  1. var Adj = (from c in View.AdjustmentsDataSource.AsEnumerable()
  2. where c["Adjustment"] != System.DBNull.Value
  3. select c);
  4. if (Adj == null || Adj.Count() == 0)
  5. return;
  6. DataTable dtChanges = Adj.CopyToDataTable();
xwbd5t1u

xwbd5t1u5#

  1. var results = from myRow in dtL1Users.AsEnumerable()
  2. 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)))
  3. select myRow;
  4. foreach (var v in results)
  5. {
  6. collEligible = results.CopyToDataTable<DataRow>();
  7. break;
  8. }
e3bfsja2

e3bfsja26#

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

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

slwdgvem7#

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

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

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

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

anauzrmj8#

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

  1. IEnumerable<DataRow> result = <<Some Linq Query>>;
  2. if (result.Any())
  3. {
  4. }

相关问题