【问题标题】:loop through sql results and delete the single rows循环遍历 sql 结果并删除单行
【发布时间】:2022-01-08 18:57:21
【问题描述】:

我试图通过 for 循环从列表中删除人员。我现在的问题是我试图找到每个 id 来删除我的数据库的特定行,但我不知道如何使用 for 循环来做到这一点。

我现在的代码:

[HttpPost("delUebertrag/")]
        public async Task<ActionResult<ProzessPersonenzuordnungen>> delRecUebertrag([FromBody] recUebertragModel user)
        {
            ProzessPersonenzuordnungen ppz = new();
            for (var i = 0; i <= user.personList.Length; i++)
            {
                Guid personId = new Guid(user.personList[i]);
                ppz.ProzessId = new Guid(user.prozessId);
                var prozessPersonenzuordnungen = _context.ProzessPersonenzuordnungens.Where(p => p.ProzessId == ppz.ProzessId && p.PersonId == personId);

                if (prozessPersonenzuordnungen == null)
                {
                    return NotFound();
                }
                //Everythings works fine above, prozessPersonenzuordnungen haves for Example 2 results
                for(var j = 0; j < prozessPersonenzuordnungen.Count(); j++) // i dont know if Counts is fine, looking for something like length of the results
                {
                    var toDeletingRow = await _context.ProzessPersonenzuordnungens.FindAsync(prozessPersonenzuordnungen.Select(p => p.ProzessPersonenzuordnungId)); // Here i need to go through every singleId of my results, something like p.ProzessPersonenzuordnungId[j](does not work) 
                    _context.ProzessPersonenzuordnungens.Remove(toDeletingRow);
                    await _context.SaveChangesAsync();
                }
               
            }
            return Ok();
        }

【问题讨论】:

    标签: c# asp.net .net


    【解决方案1】:

    FindAsync 只能用于单个项目。而是这样做

    var rowsToDelete = _context.ProzessPersonenzuordnungens.Where(x=> prozessPersonenzuordnungen.Select(p => p.ProzessPersonenzuordnungId).Contains(x.Id));
    

    使用移除而不是移除

    _context.ProzessPersonenzuordnungens.RemoveRange(rowsToDelete);
    

    还有一点很重要,循环访问数据库是一种非常糟糕的做法。 尝试不使用循环。

    编辑:

    试试这个

    ProzessPersonenzuordnungen ppz = new ProzessPersonenzuordnungen();
            for (var i = 0; i <= user.personList.Length; i++)
            {
                Guid personId = new Guid(user.personList[i]);
                ppz.ProzessId = new Guid(user.prozessId);
                var prozessPersonenzuordnungen = _context.ProzessPersonenzuordnungens.Where(p => p.ProzessId == ppz.ProzessId && p.PersonId == personId)
                    .Select((x)=> x.ProzessPersonenzuordnungId);
    
                if (prozessPersonenzuordnungen == null)
                {
                    return NotFound();
                }
    
                var rowsToDelete = _context.ProzessPersonenzuordnungens.Where(x => prozessPersonenzuordnungen.Contains(x.Id));
                _context.ProzessPersonenzuordnungens.RemoveRange(rowsToDelete);
                await _context.SaveChangesAsync();
                return Ok();
            }
    

    【讨论】:

    • Includes 在这种情况下不起作用。 “Guid 不包含包含的定义”。
    • @DeChopper,代替包含,尝试包含。它应该工作。
    • 好的,我现在删除了 for 循环。 x.Id 不存在,所以我将其更改为 x.ProzessPersonenzuordnungId 仍然无法正常工作。
    • @DeChopper,我已经编辑了答案以包含整个部分。试试那个。
    • x.Id 仍然不存在,也尝试了其他一些方法仍然无法正常工作并抛出错误 500
    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2019-11-07
    • 2012-03-16
    • 2019-11-10
    • 1970-01-01
    • 2013-09-14
    • 2019-02-18
    相关资源
    最近更新 更多