Ich möchte einige Eigenschaften eines LINQ-Abfrageergebnisobjekts ändern, ohne ein neues Objekt zu erstellen und jede Eigenschaft manuell festzulegen. Ist das möglich?
Beispiel:
var list = from something in someList
select x // but change one property
Antworten:
Ich bin mir nicht sicher, wie die Abfragesyntax lautet. Aber hier ist das erweiterte LINQ-Ausdrucksbeispiel.
Dies verwendet eine anonyme Methode vs und Ausdruck. Auf diese Weise können Sie mehrere Anweisungen in einem Lambda verwenden. Sie können also die beiden Operationen zum Festlegen der Eigenschaft und zum Zurückgeben des Objekts in diese etwas prägnante Methode kombinieren.
quelle
ToList()
Vorher scheint den Trick zu tun. Ich bin mir nicht sicher, warum du das bekommst. Wenn es sich um Entity Framework handelt, funktioniert es auch damit nicht.Wenn Sie nur die Eigenschaft für alle Elemente aktualisieren möchten, dann
quelle
Ich bevorzuge dieses hier. Es kann mit anderen linq-Befehlen kombiniert werden.
quelle
Es sollte keine LINQ-Magie geben, die Sie davon abhält. Verwenden Sie jedoch keine Projektion, da dies einen anonymen Typ zurückgibt.
Dadurch wird das reale Objekt geändert und:
quelle
Mit den Standard-Abfrageoperatoren ist dies nicht möglich. Es handelt sich um eine sprachintegrierte Abfrage, nicht um eine sprachintegrierte Aktualisierung. Sie können Ihr Update jedoch in Erweiterungsmethoden ausblenden.
Jetzt können Sie es wie folgt verwenden.
quelle
UPDATE
,DELETE
undINSERT
. Ich würde also nicht argumentieren, dass Semantik diese Funktion verhindert.Wenn Sie Elemente mit einer
Where
Klausel aktualisieren möchten, werden Ihre Ergebnisse durch die Verwendung von .Where (...) abgeschnitten, wenn Sie Folgendes tun:Sie können bestimmte Elemente in der Liste folgendermaßen aktualisieren:
Geben Sie den Artikel immer zurück, auch wenn Sie keine Änderungen vornehmen. Auf diese Weise wird es in der Liste beibehalten.
quelle
Wir stoßen häufig darauf, wenn wir den Indexwert sowie den ersten und den letzten Indikator in eine Liste aufnehmen möchten, ohne ein neues Objekt zu erstellen. Auf diese Weise können Sie die Position des Elements in Ihrer Liste, Aufzählung usw. ermitteln, ohne die vorhandene Klasse ändern zu müssen und dann zu wissen, ob Sie sich am ersten oder am letzten Element in der Liste befinden.
Sie können jede Klasse einfach erweitern, indem Sie Folgendes verwenden:
quelle
Da ich hier keine Antwort gefunden habe, die ich für die beste Lösung halte, hier mein Weg:
Die Verwendung von "Auswählen" zum Ändern von Daten ist möglich, jedoch nur mit einem Trick. "Select" ist dafür sowieso nicht gemacht. Bei Verwendung mit "ToList" wird die Änderung nur ausgeführt, da Linq nicht ausgeführt wird, bevor die Daten benötigt werden. Wie auch immer, die beste Lösung ist die Verwendung von "foreach". Im folgenden Code sehen Sie:
Vor "foreach" können Sie auch eine linq-Auswahl treffen ...
quelle
Würde das bekommen
item
, und dann könntest du es tunitem.prop1=5;
, um die spezifische Eigenschaft zu ändern.Oder möchten Sie eine Liste von Elementen aus der Datenbank abrufen und die Eigenschaft
prop1
für jedes Element in dieser zurückgegebenen Liste auf einen bestimmten Wert ändern lassen ? Wenn ja, könnten Sie dies tun (ich mache es in VB, weil ich es besser weiß):(
list
enthält alle mit Ihren Änderungen zurückgegebenen Artikel)quelle
for each
Schleife geschrieben werden muss.Im Jahr 2020 verwende ich die
MoreLinq
Pipe
Methode. https://morelinq.github.io/2.3/ref/api/html/M_MoreLinq_MoreEnumerable_Pipe__1.htmquelle
quelle