Chcę zmienić niektóre właściwości obiektu wynikowego zapytania LINQ bez tworzenia nowego obiektu i ręcznego ustawiania każdej właściwości. czy to możliwe?
Przykład:
var list = from something in someList
select x // but change one property
Odpowiedzi:
Nie jestem pewien, jaka jest składnia zapytania. Ale oto przykład rozszerzonego wyrażenia LINQ.
To robi to użyć anonimowej metody vs i wyrażenia. Pozwala to na użycie kilku instrukcji w jednej lambda. Możesz więc połączyć dwie operacje ustawiania właściwości i zwracania obiektu do tej nieco zwięzłej metody.
źródło
ToList()
przed tym wydaje się załatwić sprawę. Nie jestem pewien, dlaczego to dostajesz. Jeśli jest to Entity Framework, to też z tym nie działa.Jeśli chcesz po prostu zaktualizować właściwość we wszystkich elementach, to
źródło
Wolę tą. Można go łączyć z innymi poleceniami linq.
źródło
Nie powinna istnieć żadna magia LINQ powstrzymująca cię przed zrobieniem tego. Nie używaj jednak projekcji, która zwróci anonimowy typ.
To zmodyfikuje prawdziwy obiekt, a także:
źródło
Nie jest to możliwe w przypadku standardowych operatorów zapytań - jest to Zapytanie zintegrowane z językiem, a nie Aktualizacja zintegrowana z językiem. Ale możesz ukryć swoją aktualizację w metodach rozszerzenia.
Teraz możesz go używać w następujący sposób.
źródło
UPDATE
,DELETE
iINSERT
. Nie argumentowałbym więc, że semantyka jest tym, co zapobiega tej funkcji.Jeśli chcesz zaktualizować elementy za pomocą
Where
klauzuli, użycie .Where (...) obetnie wyniki, jeśli:Możesz dokonywać aktualizacji określonych pozycji na liście w następujący sposób:
Zawsze zwracaj przedmiot, nawet jeśli nie dokonasz żadnych zmian. W ten sposób będzie on przechowywany na liście.
źródło
Często spotykamy się z tym, że chcemy dołączyć wartość indeksu oraz pierwszy i ostatni wskaźnik do listy bez tworzenia nowego obiektu. To pozwala poznać pozycję elementu na liście, wyliczenie itp. Bez konieczności modyfikowania istniejącej klasy, a następnie wiedzieć, czy jesteś na pierwszym elemencie na liście, czy na ostatnim.
Możesz po prostu rozszerzyć dowolną klasę, używając:
źródło
Ponieważ nie znalazłem tutaj odpowiedzi, którą uważam za najlepsze rozwiązanie, oto moja droga:
Używanie „Wybierz” do modyfikowania danych jest możliwe, ale z pewną sztuczką. W każdym razie „Select” nie jest do tego stworzony. Po prostu wykonuje modyfikację, gdy jest używana z „ToList”, ponieważ Linq nie wykonuje się przed potrzebą danych. W każdym razie najlepszym rozwiązaniem jest użycie „foreach”. W poniższym kodzie widać:
Przed „foreach” możesz również dokonać wyboru linq ...
źródło
Otrzymałbym
item
, a następnie możesz zrobić,item.prop1=5;
aby zmienić konkretną właściwość.A może chcesz uzyskać listę elementów z bazy danych i zmienić tę właściwość
prop1
dla każdego elementu na tej zwróconej liście na określoną wartość? Jeśli tak, możesz to zrobić (robię to w VB, ponieważ wiem to lepiej):(
list
będzie zawierać wszystkie elementy zwrócone z Twoimi zmianami)źródło
for each
pętli.W 2020 roku korzystam z tej
MoreLinq
Pipe
metody. https://morelinq.github.io/2.3/ref/api/html/M_MoreLinq_MoreEnumerable_Pipe__1.htmźródło
źródło