Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从datatable中删除行会导致错误_C#_Linq_Datatable - Fatal编程技术网

C# 从datatable中删除行会导致错误

C# 从datatable中删除行会导致错误,c#,linq,datatable,C#,Linq,Datatable,我试图从数据表中删除不需要的行。基本上,可能有几行的itemID是相同的。我想找到failEmail=fail列所在的行,并使用这些行的itemID,从emails数据表中删除具有相同itemID的所有行 以下是我尝试过的: System.Diagnostics.Debug.Print(emails.Rows.Count.ToString() + " emails!"); // create a list of the email IDs for records that will be de

我试图从数据表中删除不需要的行。基本上,可能有几行的itemID是相同的。我想找到failEmail=fail列所在的行,并使用这些行的itemID,从emails数据表中删除具有相同itemID的所有行

以下是我尝试过的:

System.Diagnostics.Debug.Print(emails.Rows.Count.ToString() + " emails!");

// create a list of the email IDs for records that will be deleted
List<DataRow> rows2Delete = new List<DataRow>();

foreach (DataRow dr in emails.Rows) 
{
   if (dr["failEmail"].ToString().ToLower() == "fail") 
   {
      rows2Delete.Add(dr);
   }
}

foreach (DataRow row in rows2Delete)
{
   DataRow[] drRowsToCheck =emails.Select("itemID ='" + row["itemID"].ToString()  +"'");
   foreach (DataRow drCheck in drRowsToCheck)
   {
      emails.Rows.RemovedDrCheck);
      emails.AcceptChanges();
   }
}
这是我在第二次通过时收到的错误消息:

此行已从表中删除,没有任何数据。 BeginEdit将允许在此行中创建新数据

我怎样才能做我需要做的事而不犯这样的错误呢?有没有比使用LiNQ查询更好的方法


DataTable.Select返回与筛选条件匹配的所有DataRow对象的数组。

问题在于,当同一itemID有多个带有“fail”的条目时,您试图多次删除它们

// 1. Find the Unique itemIDs to remove
var idsToRemove = emails.Select("failEmail = 'fail'").Select (x => x["itemID"]).Distinct();
// 2. Find all the rows that match the itemIDs found
var rowsToRemove = emails.Select(string.Format("itemID in ({0})", string.Join(", ", idsToRemove)));
// 3. Remove the found rows.
foreach(var rowToRemove in rowsToRemove)
{
    emails.Rows.Remove(rowToRemove);
}
emails.AcceptChanges();

根据我从MSDN c论坛上得到的答案,我最终就是这么做的:

在DataTable上创建扩展以启用DataTable的LINQ euering:

public static class DataTableExtensions
{
   public static IEnumerable<DataRow> RowsAsEnumerable ( this DataTable source )
        {
            return (source != null) ? source.Rows.OfType<DataRow>() : Enumerable.Empty<DataRow>();
        }
}

现在它可以工作了,只希望我能以正常的方式成功完成。

调用delete方法就行了吗?类似于:emails.rows[0].delete;?此外,如果这是代码的复制/粘贴,那么这一行中有一个错误的括号:emails.Rows.RemovedDrCheck;移除它或添加开头括号,使其显示emails.Rows.RemovedDrCheck@ArmadDrive问题是最初只有几行会失败,我需要获取这些行的itemID,然后选择所有这些…你能解释你的答案吗问题是emailsdatatable中只有几行会失败,我需要获取这些行的itemID,然后选择与这些ItemID匹配的所有行…我在代码中得到一个“System.NullReferenceException”异常-即使datatable中有记录,并且记录与选择匹配
public static class DataTableExtensions
{
   public static IEnumerable<DataRow> RowsAsEnumerable ( this DataTable source )
        {
            return (source != null) ? source.Rows.OfType<DataRow>() : Enumerable.Empty<DataRow>();
        }
}
//Get IDs to delete
var deleteIds = from r in emails.RowsAsEnumerable()
                 where String.Compare(r["failEmail"].ToString(), "fail", true) == 0
                 select r["itemID"];

//Get all rows to delete
var rows2Delete = (from r in emails.RowsAsEnumerable()
                  where deleteIds.Contains(r["itemID"])
                  select r).ToList();

//Now delete them
foreach (var row in rows2Delete)
    emails.Rows.Remove(row);
emails.AcceptChanges();