如何在此代码中删除多行记录

时间:2013-11-29 06:25:47

标签: c# .net linq linq-to-sql

private void btnDel_Click(object sender, EventArgs e)
{
    if (MessageBox.Show("Are you sure to Delete this Record?", "Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Stop) == DialogResult.Yes)
    {
        using (SFCDataContext SFC = new SFCDataContext())
        {
            var countRec = SFC.Systems_MonitoringMeasurementHeaders.Where(t => t.DocNO == DocNum.Text && t.DetailsDocNum == clsVariable.GetDocNumRecord).Count();
            if (countRec > 0)
            {
                Systems_MonitoringMeasurementHeader Table = SFC.Systems_MonitoringMeasurementHeaders.FirstOrDefault(r => r.DocNO == DocNum.Text && r.DetailsDocNum == clsVariable.GetDocNumRecord);
                SFC.Systems_MonitoringMeasurementHeaders.DeleteOnSubmit(Table);
            }

            var countRecDetails = SFC.Systems_MonitoringMeasurementDetails.Where(y => y.DocNO == DocNum.Text && y.DetailsDocNum == clsVariable.GetDocNumRecord).Count(); <-- Starts here..
            if (countRecDetails > 0)
            {
                for (int i = 0; i < countRecDetails; i++)
                {
                    Systems_MonitoringMeasurementDetail TableDetails = SFC.Systems_MonitoringMeasurementDetails.FirstOrDefault(w => w.DocNO == DocNum.Text && w.DetailsDocNum == clsVariable.GetDocNumRecord);
                    SFC.Systems_MonitoringMeasurementDetails.DeleteOnSubmit(TableDetails);
                }
            } <-- Til here

            SFC.SubmitChanges();
            SFC.Connection.Close();
            gfunc.setMessageBox("Delete Successful!", 2);
            ClearFields(2);
            btnSetLock(true, false, true, false, false, false, false, true);
            DocNum.Enabled = true;
            DocNum.Focus();
        }
    }
}

问题是在删除详细记录时它确实执行了删除但它只删除了一行。而不是5或更多..它只需要第一个条目。我通过调试中参考找到的记录的计数来制作一个for循环语句,它显示了记录ex的确切计数。 5所以它循环删除记录5次,但只删除第一个条目,其余没有。为什么?请帮忙。

- 更新 -

if (MessageBox.Show("Are you sure to Delete this Record?", "Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Stop) == DialogResult.Yes)
            {
                using (SFCDataContext SFC = new SFCDataContext())
                {
                    var countRec = SFC.Systems_MonitoringMeasurementHeaders.Where(t => t.DocNO == DocNum.Text && t.DetailsDocNum == clsVariable.GetDocNumRecord);
                    if (countRec.Count() > 0)
                    {
                        SFC.Systems_MonitoringMeasurementHeaders.DeleteAllOnSubmit(countRec.ToList());
                    }

                    var countRecDetails = SFC.Systems_MonitoringMeasurementDetails.Where(y => y.DocNO == DocNum.Text && y.DetailsDocNum == clsVariable.GetDocNumRecord);
                    if (countRecDetails.Count() > 0)
                    {
                        SFC.Systems_MonitoringMeasurementDetails.DeleteAllOnSubmit(countRecDetails.ToList());                        
                    }

                    SFC.SubmitChanges();
                    SFC.Connection.Close(); 
                }
                gfunc.setMessageBox("Delete Successful!", 2);
                ClearFields(2);
                btnSetLock(true, false, true, false, false, false, false, true);
                DocNum.Enabled = true;
                DocNum.Focus();
            }

它有效,但我不知道是否可以。

2 个答案:

答案 0 :(得分:4)

您的解决方案无效,因为您要查询实体是否在循环中删除,但您不会在每个步骤上提交更改。因此,你得到完全相同的第一行5次(因为数据库在这里没有改变)。您将其标记为删除5次。然后在提交期间,您只删除此行。

您可以使用单个查询,而不是进行两次查询(一次用于检查实体是否存在,以及其他需要加载的实体):

var header = SFC.Systems_MonitoringMeasurementHeaders
           .FirstOrDefault(h => h.DocNO == DocNum.Text && 
                                h.DetailsDocNum == clsVariable.GetDocNumRecord);
if (header != null)   
    SFC.Systems_MonitoringMeasurementHeaders.DeleteOnSubmit(header);

与多个实体相同(此处您有6个查询而不是一个)

var details = SFC.Systems_MonitoringMeasurementDetails
                 .Where(d => d.DocNO == DocNum.Text &&
                             d.DetailsDocNum == clsVariable.GetDocNumRecord);

foreach(var detail in details)    
    SFC.Systems_MonitoringMeasurementDetails.DeleteOnSubmit(detail);

SFC.SubmitChanges();

请记住 - 在您致电SubmitChanges()之前,数据库中未更新任何内容。如果在不更改数据库的情况下多次执行相同的查询,则会返回相同的数据。

答案 1 :(得分:2)

我猜你没有意识到你要删除第一行5次。 建议使用DeleteAllOnSubmit方法删除多行。

var tableDetails = SFC.Systems_MonitoringMeasurementDetails.Where(
                       y => y.DocNO == DocNum.Text && 
                       y.DetailsDocNum == clsVariable.GetDocNumRecord);

if(tableDetails.Any())
{
    SFC.Systems_MonitoringMeasurementDetails.DeleteAllOnSubmit(tableDetails);
}