在 LINQ 中将“Remove”与 Entity Framework 6 一起使用会导致编译错误

Using "Remove" in LINQ with Entity Framework 6 causing compile error

提问人:John H. 提问时间:11/10/2023 最后编辑:marc_sJohn H. 更新时间:11/10/2023 访问量:43

问:

这种方法没有编译,我似乎找不到好的修复方法。

目标是从调用的“周期表”中删除所有大于或等于要传入的变量的行:tblPeriodsStartDatefromDate

public override bool BulkDeletePeriods(DateTime fromDate)
{
    var entities = GetEntities();

    var toDelete = entities.tblPeriods
                           .Where(x => x.StartDate >= fromDate);

    entities.tblPeriods.Remove(toDelete);

    return Convert.ToBoolean(entities.SaveChanges());
}

这是我得到的编译时错误:

错误 CS1503
参数 1:无法从“System.Linq.IQueryable”转换为“tblPeriod”

C# LINQ 实体框架-6

评论

0赞 Viktor Arsanov 11/10/2023
您可能忘记在获取 toDelete 时添加 FirstOrDefault
4赞 Svyatoslav Danyliv 11/10/2023
请尝试。您传递了而不是对象。RemoveRangeIQueryable
0赞 John H. 11/10/2023
删除 => 数据库中的单行。RemoveRange => 中的多行

答:

0赞 Dave Cousineau 11/10/2023 #1

我不认为那样工作。默认情况下,“批量”操作在 EF 中并不真正起作用,尽管我认为您可以获得具有它们的第三方库。Remove

示例的快速解决方案如下所示:

var toDelete = 
   entities
   .tblPeriods
   .Where(x => x.StartDate >= fromDate)
   .ToList();

foreach (var item in toDelete)
   entities.tblPeriods.Remove(item);

或者用:RemoveRange

var toDelete = 
   entities
   .tblPeriods
   .Where(x => x.StartDate >= fromDate)
   .ToList();

entities.tblPeriods.RemoveRange(toDelete);

请注意,这仍然不是“批量”操作。它将通过其键单独删除每一行。如前所述,如果您真的想要一个 ,您将需要某种第三方库。(尽管如果我记得的话,批量操作可能很快就会在 EF Core 中推出。RemoveRangeDELETE WHERE