Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心Linq查询返回数据库中不存在的ID_C#_Linq_Linq To Sql_.net Core_Entity Framework Core - Fatal编程技术网

C# 实体框架核心Linq查询返回数据库中不存在的ID

C# 实体框架核心Linq查询返回数据库中不存在的ID,c#,linq,linq-to-sql,.net-core,entity-framework-core,C#,Linq,Linq To Sql,.net Core,Entity Framework Core,我想知道是否有一种简单的方法可以使用具有实体框架核心的linqtosql查询检查数据库中是否存在给定的id列表,并返回不存在的id列表 我遇到的用例是,如果用户可以使用对象列表(通过其ID列表表示)做一些事情,我想检查这些ID是否存在 当然,我可以查询数据库中存在的所有对象/对象ID,并在第二步中进行交叉检查 只是想知道这是否可能在一个步骤 我在代码中的意思是: public class MyDbObject { public int Id { get; set; } publ

我想知道是否有一种简单的方法可以使用具有实体框架核心的linqtosql查询检查数据库中是否存在给定的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));
}
公共类MyDbObject
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
public IActionResult DoSomethingWithObjects([FromQuery]列表ID}
{
列出不存在于db=DbContext.MyDbObject中的ID,其中(???)
return NotFound(“那些ID不存在:“+string.Join”(“,”,idsThatDoNotExist));
}

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

var validIds = DbContext
    .MyDbObject
    .Where(obj => ids.Contains(obj.Id))
    .Select(obj => obj.Id);
var idsThatDoNotExistInTheDb = ids.Except(validIds);
不过,这种方法可能比较慢,因此最好在采用表值参数()的存储过程中进行


注意:这种预检查不是防弹的,因为在验证ID和启动操作之间可能会发生变化。最好以验证的方式构造API,然后立即执行它需要执行的任何操作。如果验证失败,API将返回错误列表ors.

请注意一个问题。有没有任何关于如何重新构造此结构的提示?让用例是,我希望在MyDbObject和MyDbObject2之间的m:n表中使用MyDbObject的ID,并且我希望避免等待DbUpdateException。识别其中一个外键(在m:n表中)时会引发该异常无法设置,因为缺少一个ID。因此,我执行此预检查并返回一个错误或InternalServerError(如果在其间被删除)。尚未找到如何“完美”解决此问题的方法。重构不一定使用linq。@monty捕获
DbUpdateException
本身并没有什么错误,只是它不向您提供验证失败的ID列表。解决此问题的一种方法是创建一个存储过程来执行验证,并在单个transac中执行您希望执行的操作此存储过程将返回失败ID的列表,如果一切正常,则返回空列表。