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();