Saya ingin mengubah beberapa properti dari objek hasil pencarian LINQ tanpa membuat objek baru dan secara manual mengatur setiap properti. Apakah ini mungkin?
Contoh:
var list = from something in someList
select x // but change one property
Jawaban:
Saya tidak yakin apa sintaks kueri itu. Tapi di sini adalah contoh ekspresi LINQ yang diperluas.
Apa yang dilakukan adalah menggunakan metode anonim vs dan ekspresi. Ini memungkinkan Anda untuk menggunakan beberapa pernyataan dalam satu lambda. Jadi, Anda dapat menggabungkan dua operasi pengaturan properti dan mengembalikan objek ke metode yang ringkas ini.
sumber
ToList()
sebelum sepertinya berhasil. Tidak yakin mengapa Anda mendapatkannya. Jika itu adalah Entity Framework, itu tidak berfungsi dengan baik.Jika Anda hanya ingin memperbarui properti pada semua elemen, maka
sumber
Saya lebih suka yang ini. Itu dapat dikombinasikan dengan perintah LINQ lainnya.
sumber
Seharusnya tidak ada sihir LINQ yang mencegah Anda melakukan ini. Jangan gunakan proyeksi meskipun itu akan menghasilkan tipe anonim.
Itu akan mengubah objek nyata, serta:
sumber
Ini tidak mungkin dengan operator kueri standar - itu adalah Bahasa Integrated Query, bukan Language Integrated Update. Tetapi Anda dapat menyembunyikan pembaruan Anda dalam metode ekstensi.
Sekarang Anda dapat menggunakannya sebagai berikut.
sumber
UPDATE
,DELETE
, danINSERT
. Jadi saya tidak akan berpendapat bahwa semantik adalah hal yang mencegah fungsi ini.Jika Anda ingin memperbarui item dengan
Where
klausa, menggunakan .Where (...) akan memotong hasil Anda jika Anda melakukannya:Anda dapat melakukan pembaruan untuk item tertentu dalam daftar seperti:
Selalu kembalikan item meskipun Anda tidak melakukan perubahan. Dengan cara ini akan disimpan dalam daftar.
sumber
Kami sering mengalami hal ini di mana kami ingin memasukkan nilai indeks dan indikator pertama dan terakhir dalam daftar tanpa membuat objek baru. Ini memungkinkan Anda mengetahui posisi item dalam daftar Anda, enumerasi, dll. Tanpa harus memodifikasi kelas yang ada dan kemudian mengetahui apakah Anda berada di item pertama dalam daftar atau yang terakhir.
Anda bisa memperpanjang kelas apa saja dengan menggunakan:
sumber
Karena saya tidak menemukan jawaban di sini yang saya anggap solusi terbaik, inilah cara saya:
Menggunakan "Pilih" untuk memodifikasi data dimungkinkan, tetapi hanya dengan trik. Lagi pula, "Pilih" tidak dibuat untuk itu. Itu hanya menjalankan modifikasi ketika digunakan dengan "Daftar", karena Linq tidak mengeksekusi sebelum data sedang diperlukan. Bagaimanapun, solusi terbaik adalah menggunakan "foreach". Dalam kode berikut, Anda dapat melihat:
Sebelum "foreach", Anda juga dapat membuat pilihan LINQ ...
sumber
Akan mendapatkan
item
, dan kemudian Anda bisa lakukanitem.prop1=5;
untuk mengubah properti tertentu.Atau Anda ingin mendapatkan daftar item dari db dan mengubahnya mengubah properti
prop1
pada setiap item dalam daftar yang dikembalikan ke nilai yang ditentukan? Jika demikian Anda bisa melakukan ini (saya melakukannya di VB karena saya tahu lebih baik):(
list
akan berisi semua item yang dikembalikan bersama perubahan Anda)sumber
for each
lingkaran.Pada tahun 2020 saya menggunakan
MoreLinq
Pipe
metode ini. https://morelinq.github.io/2.3/ref/api/html/M_MoreLinq_MoreEnumerable_Pipe__1.htmsumber
sumber