Пока Ids
достаточно мало, я бы использовал Contains
:
var existingIds = myDbContext.Table1.Select(x => x.Id)
.Where(id => Ids.Contains(id))
.ToHashSet();
var nonExistentIds = ids.Where(id => !existingIds.Contains(id));
Это должно перевести что-то вроде
SELECT
[Extent1].[Id] AS [Id]
FROM [dbo].[Table1] AS [Extent1]
WHERE [Extent1].[Id] IN (1, 2, 3, 4)
, а затем вы переверните результат с LINQ to Objects.
Вы также можете изменить с помощью Except
:
var nonExistentIds = ids.Except(myDbContext.Table1.Select(x => x.Id)
.Where(id => Ids.Contains(id)));
Преимущество Contains
над Intersect
заключается в том, что список идентификаторов отправляется на SQL Сервер - Intersect
очень многословно создает таблицу с UNION ALL
, которая быстрее переполняется SQL.