Je souhaite modifier certaines propriétés d'un objet de résultat de requête LINQ sans créer un nouvel objet et définir manuellement chaque propriété. Est-ce possible?
Exemple:
var list = from something in someList
select x // but change one property
Réponses:
Je ne suis pas sûr de la syntaxe de la requête. Mais voici l'exemple d'expression LINQ développé.
Cela utilise une méthode anonyme vs et une expression. Cela vous permet d'utiliser plusieurs instructions dans un lambda. Vous pouvez donc combiner les deux opérations de définition de la propriété et de retour de l'objet dans cette méthode quelque peu succincte.
la source
ToList()
avant qui semble faire l'affaire. Je ne sais pas pourquoi vous obtenez cela. Si c'est Entity Framework, il ne fonctionne pas non plus avec cela.Si vous souhaitez simplement mettre à jour la propriété sur tous les éléments,
la source
Je préfère celui-ci. Il peut être combiné avec d'autres commandes linq.
la source
Aucune magie LINQ ne devrait vous empêcher de le faire. N'utilisez cependant pas de projection qui renverra un type anonyme.
Cela modifiera l'objet réel, ainsi que:
la source
Ce n'est pas possible avec les opérateurs de requête standard - c'est Language Integrated Query, pas Language Integrated Update. Mais vous pouvez masquer votre mise à jour dans les méthodes d'extension.
Vous pouvez maintenant l'utiliser comme suit.
la source
UPDATE
,DELETE
etINSERT
. Je ne dirais donc pas que la sémantique est la chose qui empêche cette fonction.Si vous souhaitez mettre à jour des éléments avec une
Where
clause, l'utilisation d'un .Where (...) tronquera vos résultats si vous le faites:Vous pouvez effectuer des mises à jour sur des éléments spécifiques de la liste comme suit:
Renvoyez toujours l'article même si vous n'apportez aucune modification. De cette façon, il sera conservé dans la liste.
la source
Nous rencontrons souvent ceci où nous voulons inclure la valeur d'index et les premier et dernier indicateurs dans une liste sans créer un nouvel objet. Cela vous permet de connaître la position de l'élément dans votre liste, l'énumération, etc. sans avoir à modifier la classe existante et à savoir ensuite si vous êtes au premier élément de la liste ou au dernier.
Vous pouvez simplement étendre n'importe quelle classe en utilisant:
la source
Comme je n'ai pas trouvé ici la réponse que je considère comme la meilleure solution, voici mon chemin:
Utiliser "Select" pour modifier les données est possible, mais juste avec une astuce. Quoi qu'il en soit, "Select" n'est pas fait pour ça. Il exécute simplement la modification lorsqu'il est utilisé avec "ToList", car Linq ne s'exécute pas avant que les données ne soient nécessaires. Quoi qu'il en soit, la meilleure solution consiste à utiliser "foreach". Dans le code suivant, vous pouvez voir:
Avant "foreach", vous pouvez également faire une sélection linq ...
la source
Obtiendrait le
item
, puis vous pourriez faireitem.prop1=5;
pour modifier la propriété spécifique.Ou souhaitez-vous obtenir une liste d'éléments de la base de données et lui faire changer la propriété
prop1
de chaque élément de cette liste renvoyée en une valeur spécifiée? Si oui, vous pouvez le faire (je le fais en VB parce que je le sais mieux):(
list
contiendra tous les articles retournés avec vos modifications)la source
for each
boucle.En 2020 j'utilise la
MoreLinq
Pipe
méthode. https://morelinq.github.io/2.3/ref/api/html/M_MoreLinq_MoreEnumerable_Pipe__1.htmla source
la source