Utilisation de EF Core 3.x
J'essaie de vérifier si une table de la base de données, Ducks
contient déjà tous les enregistrements dont la combinaison de valeurs correspond, à partir d'une liste de valeurs combinées, stockée dans une classe : Duck
.
Je m'attends à ce que l'on me renvoie l'information suivante Duck.Id
des enregistrements qui existent déjà / qui ont les valeurs correspondantes que je transmets.
Pour l'instant, je ne peux que vérifier si un seul combo existe à la fois en utilisant la requête suivante
La combinaison ici est 1, "NV", et "Mallard". Le résultat est le suivant true
var duckExists = Ducks
.Any(duck =>
duck.PondId == 1 &&
duck.StateId == "NV" &&
duck.Type == "Mallard");
Je souhaite maintenant vérifier si plusieurs Ducks
existe déjà.
J'ai une liste, ducksToCheck
que je souhaite utiliser pour interroger la base de données afin de vérifier si l'un d'entre eux existe déjà :
var ducksToCheck = new List<Duck>() {
// Does exist
new Duck{
PondId = 1,
State = "NV",
Breed = "Mallard"
},
// Does exist
new Duck{
PondId = 2,
State = "AZ",
Breed = "Crested"
},
// Does not exist
new Duck{
PondId = 1,
State = "AZ",
Breed = "Crested"
},
// Does not exist
new Duck{
PondId = 2,
State = "NV",
Breed = "Mallard"
}
};
Ma dernière tentative a consisté à placer chaque valeur unique de la combinaison dans sa propre liste et à la comparer à ces listes dans la requête.
Cela ne fonctionne pas car tant qu'un Duck
a une valeur correspondante dans chaque liste, il est perçu comme existant alors qu'il n'existe pas.
Par exemple, le troisième canard : (1, "AZ", "Crested"). Puisque le SQL résultant est duck.PondId IN(pondIds) && duck.State IN(states) && duck.Breed IN(breeds)
les deux premiers canards ont un mélange de ces valeurs et il peut les mélanger pour dire qu'il existe.
var pondIds = ducksToCheck.Select(x => x.PondId).Distinct().ToList();
var states = ducksToCheck.Select(x => x.State).Distinct().ToList();
var breeds = ducksToCheck.Select(x => x.Breed).Distinct().ToList();
var existingDuckIds = Ducks
.Where(duck => pondIds
.Any(pondId => pondId == duck.pondId)
&& states.Any(state => state == duck.State)
&& breeds.Any(breed => breed == duck.Breed)
)
.Select(duck => duck.Id);
Est-il possible de demander si une combinaison unique existe dans le fichier Ducks
à partir d'une liste de combinaisons, sans envoyer de requête pour chaque combinaison individuelle / Duck
en ducksToCheck
?