Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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:有效地检测数据库中是否存在所有元素_C#_Entity Framework_Linq - Fatal编程技术网

C# 实体框架/Linq:有效地检测数据库中是否存在所有元素

C# 实体框架/Linq:有效地检测数据库中是否存在所有元素,c#,entity-framework,linq,C#,Entity Framework,Linq,评论后添加,我的问题不够清楚 一些软件访问数据库并检索项目集合。他选择了其中的一个子集,并打电话给我要求处理收集。 在其他软件访问数据库和调用我之间,其他软件可能会删除项目 其他过程: IEnumerable<MyType> itemsToProcess = FetchItemsToProcess(); Process(itemsToProcess); 以下方法需要对每个项目进行一次DB访问才能进行检查: IEnumerable<MyType> itemsToProce

评论后添加,我的问题不够清楚

一些软件访问数据库并检索项目集合。他选择了其中的一个子集,并打电话给我要求处理收集。 在其他软件访问数据库和调用我之间,其他软件可能会删除项目

其他过程:

IEnumerable<MyType> itemsToProcess = FetchItemsToProcess();
Process(itemsToProcess);
以下方法需要对每个项目进行一次DB访问才能进行检查:

IEnumerable<MyType> itemsToProcess = ...
IEnumerable<int> idsToProcess = itemsToProcess.Select(item => item.Id);
bool nonExistingItemsDetected = idsToProcess
    .Where(idToProcess => !myDbContext.MyItems.Any(item => item.Id == idToProcess);

我可以使用什么谓词来检测idsToProcess是否包含不存在的项的ID。

如果仍然需要处理这些项,则需要从数据库中获取它们。在这种情况下,您还可以使用类似以下的方法来获取匹配项:

var existingDbItems = dbContext.MyItems.Where(i => localIdCollection.Contains(i.Id));
然后,您可以在继续之前简单地检查distinct id的计数是否与返回的记录数匹配

确保使用的
.Contains()
上的id集合是内存集合(不是存储表达式),否则可能会出现异常

编辑

根据您的评论,您可以将上述查询更改为:

var existingDbItemsCount = dbContext.MyItems
     .Where(i => localIdCollection.Contains(i.Id)).Distinct().Count();
因此,您只获取计数,而不是所有记录


如果项目非常不稳定,此时您必须检查它们是否存在,除非您在事务中工作,否则在您的代码修改数据库时仍可能存在问题。

问题是,有人从数据库中检索了项目,从中选择了几个,并调用我的过程要求处理它们。我不需要再次访问此表,我有我需要的所有信息。为了进行处理,我需要使用表中的信息访问其他表。我会更新这个问题,让这个clear@HaraldCoppoolse我已经根据Count()编辑了我的答案:这样我就不必从我的项目中检索任何内容,只需检索匹配的数字。我所要做的就是检查计数是否等于我必须处理的项目数。顺便说一句:我的处理不会改变数据库,因此事务不会有帮助,我所要知道的是,进行处理是值得的,而不是在处理结束时,如果我检测到项目不再使用,就将结果扔掉
bool nonExistinItemsDetected = myDbContext.MyItems
  .Any( ?? )
var existingDbItems = dbContext.MyItems.Where(i => localIdCollection.Contains(i.Id));
var existingDbItemsCount = dbContext.MyItems
     .Where(i => localIdCollection.Contains(i.Id)).Distinct().Count();