L'itération sur un IQueryable
récupère le jeu de résultats de la base de données au fur et à mesure, comme vous le savez sûrement. Ce que j'ai observé dans cette situation et dans d'autres, c'est que ce résultat n'est pas mis en cache, donc vous trouverez souvent que l'itération sur le IQueryable
réexécutera la requête, donc vos modifications ne sont pas conservées car vous obtenez un nouveau jeu de résultats qui n'a jamais été affecté par ce code. La raison pour laquelle cela fonctionne lorsque vous appelez le ToList()
d'abord et que vous parcourez le résultat est que ToList()
récupère et matérialise l'ensemble des résultats, qui n'est plus lié au contenu de la base de données et qui n'est en fait qu'une copie de base de données retournée. La seule façon de vous assurer que vos modifications resteront est d'opérer sur la copie locale des données, c'est-à-dire de la retirer de la zone IQueryable
. Cela peut être aussi simple que d'enregistrer un IEnumerable
du jeu de résultats (c'est-à-dire le résultat de ToEnumerable()
), qui retournera le même jeu de résultats chaque fois que vous l'énumérerez, mais contrairement à ToList()
cela ne provoquera pas d'évaluation immédiatement.
Je sais que si je le convertis en Liste avant d'énumérer, j'obtiens les bons résultats. – Dante
Soit l'implémentation de IQueryable génère un nouvel ensemble à chaque itération, soit le setter de Car.Doors est 'cassé'. S'il vous plaît nous montrer où IQuerable est créé –
Polity
IQueryable est le résultat d'une requête Linq to Entities. Le setter est correct car dans la requête Linq, je peux assigner la valeur à la propriété Doors. –
Dante