Entity Framework 核心 Linq 查询返回数据库中不存在的 ID

Entity Framework Core Linq query returning ids which do not exist in database

我想知道是否有一种简单的方法使用 Linq SQL 和 Entity Framework Core 来查询检查数据库中是否存在给定的 ID 列表以及 returns 列表中的哪个不存在的 ID。

我遇到的用例是,如果用户可以对对象列表(通过其 ID 列表表示)执行某些操作,我想检查这些 ID 是否存在。

当然我可以查询数据库中存在的所有 objects/object 个 ID,然后在第二步进行交叉检查。

只是想知道是否可以一步到位。

我在代码中的意思:

public class MyDbObject 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public IActionResult DoSomethingWithObjects([FromQuery]List<int> ids} 
{
    List<int> idsThatDoNotExistInTheDb = DbContext.MyDbObject.Where(???)

    return NotFound("those ids do not exist: " + string.Join(", ", idsThatDoNotExist));
}

您可以获得匹配的ID列表,然后将它们从原始列表中删除,如下所示:

var validIds = DbContext
    .MyDbObject
    .Where(obj => ids.Contains(obj.Id))
    .Select(obj => obj.Id);
var idsThatDoNotExistInTheDb = ids.Except(validIds);

虽然这种方法可能很慢,因此您最好在采用 table-valued 参数的存储过程中执行此操作 (how?)

注意:Pre-checks这种不是bullet-proof,因为在验证ID的时刻和验证ID的时刻之间可能会发生变化开始操作。最好以一种可以验证的方式构建您的 APIs,然后立即执行任何需要执行的操作。如果验证失败,API returns 错误列表。