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 错误列表。
我想知道是否有一种简单的方法使用 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 错误列表。