Mi chiedo se c'è un modo semplice per usare Linq su SQL con Entity Framework Core per verificare se un determinato elenco di ID esiste nel database e che restituisce l'elenco di ID che non esistono.
Il caso d'uso in cui mi imbatto è se l'utente può fare qualcosa con un elenco di oggetti (rappresentato attraverso l'elenco dei loro id). Voglio verificare se questi ID esistono o no.
Ovviamente potrei interrogare tutti gli oggetti / oggetti ID che esistono nel database e il controllo incrociato in una seconda fase.
Mi chiedo solo se sarebbe possibile in un solo passaggio.
Cosa intendo nel codice:
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));
}
È possibile ottenere l'elenco di ID corrispondenti, quindi rimuoverli dall'elenco originale, in questo modo:
var validIds = DbContext
.MyDbObject
.Where(obj => ids.Contains(obj.Id))
.Select(obj => obj.Id);
var idsThatDoNotExistInTheDb = ids.Except(validIds);
Questo approccio può essere lento, quindi, potrebbe essere meglio farlo in una stored procedure che accetta un parametro con valori di tabella ( come? )
Nota: i pre-controlli di questo tipo non sono a prova di proiettile, perché potrebbe verificarsi un cambiamento tra il momento in cui si convalidano gli ID e il momento in cui si avvia l'operazione. È meglio strutturare le API in modo da convalidarle e quindi fare tutto ciò che deve fare immediatamente. Se la convalida fallisce, l'API restituisce un elenco di errori.