实体框架Core Linq查询返回数据库中不存在的ID

时间:2018-03-22 13:27:26

标签: c# linq linq-to-sql .net-core entity-framework-core

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

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

当然,我可以查询数据库中存在的所有对象/对象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));
}

1 个答案:

答案 0 :(得分:1)

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

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

但是,这种方法可能很慢,因此您最好在采用表值参数(how?)的存储过程中进行此操作

注意:此类预检不是防弹的,因为在您验证ID和开始操作的那一刻之间可能会发生更改。最好以它验证的方式构建API,然后立即执行它需要做的任何事情。如果验证失败,API将返回错误列表。