Saya memiliki kesalahan ini dalam ekspresi LINQ ini:
var naleznosci = (from nalTmp in db.Naleznosci
where nalTmp.idDziecko == idDziec
select new Payments
(
nalTmp.Dziecko.Imie,
nalTmp.Dziecko.Nazwisko,
nalTmp.Miesiace.Nazwa,
nalTmp.Kwota,
nalTmp.RodzajeOplat.NazwaRodzajuOplaty,
nalTmp.RodzajeOplat.TypyOplat.NazwaTypuOplaty,
nalTmp.DataRozliczenia,
nalTmp.TerminPlatnosci
)).ToList();
Adakah yang tahu bagaimana menyelesaikan masalah ini? Saya mencoba dengan kombinasi ekspresi apa pun:: /
c#
linq-to-entities
netmajor
sumber
sumber
Jawaban:
tanpa info lebih lanjut tentang 'Pembayaran' ini tidak banyak membantu, tetapi dengan asumsi Anda ingin membuat objek Pembayaran dan menetapkan beberapa propertinya berdasarkan pada nilai kolom:
sumber
Jika Anda masih ingin menggunakan konstruktor untuk inisialisasi dan bukan properti (kadang-kadang perilaku ini diinginkan untuk tujuan inisialisasi), sebutkan permintaan dengan menelepon
ToList()
atauToArray()
, dan kemudian gunakanSelect(…)
. Dengan demikian ia akan menggunakan LINQ untuk Koleksi dan bahwa keterbatasan tidak dapat memanggil konstruktor dengan parameter diSelect(…)
akan menghilang.Jadi kode Anda akan terlihat seperti ini:
sumber
ToX()
untuk ini, gunakanAsEnumerable()
.Baru saja mengalami kesalahan ini, saya pikir saya akan menambahkan bahwa jika
Payment
jenisnya adalahstruct
, Anda juga akan mengalami kesalahan yang sama karenastruct
jenis tidak mendukung konstruktor tanpa parameter.Dalam peristiwa itu, mengonversi
Payment
ke kelas dan menggunakan sintaks penginisialisasi objek akan menyelesaikan masalah.sumber
DateTime
(yang merupakan struct) di dalam Permintaan saya, yang menghasilkan Kesalahan yang sama. mengekstraknya ke Variabel lokal memperbaikinya untuk saya. Terima kasih atas petunjuk struct.Jika Anda seperti saya dan tidak ingin harus mengisi properti Anda untuk setiap permintaan yang Anda buat, ada cara lain untuk menyelesaikan masalah ini.
Pada titik ini Anda memiliki IQueryable yang berisi objek anonim. Jika Anda ingin mengisi objek kustom Anda dengan konstruktor, Anda cukup melakukan sesuatu seperti ini:
Sekarang objek kustom Anda (yang mengambil dua objek sebagai parameter) dapat mengisi properti Anda sesuai kebutuhan.
sumber
Pertama saya akan menghindari solusinya
Ini membutuhkan konstruktor kosong dan mengabaikan enkapsulasi sehingga Anda mengatakan Pembayaran baru () adalah pembayaran yang valid tanpa data apa pun, tetapi objek tersebut harus memiliki setidaknya nilai dan mungkin bidang yang diperlukan lainnya tergantung pada domain Anda.
Lebih baik memiliki konstruktor untuk bidang yang diperlukan tetapi hanya membawa data yang diperlukan:
sumber
Anda dapat mencoba melakukan hal yang sama, tetapi menggunakan metode ekstensi. Apa yang digunakan penyedia database?
sumber
Hanya
ToList()
yangDbSet
sebelumSelect
pernyataan .. sebenarnyaDbSet
disimpan sebagai query, itu belum terpenuhi. Setelah memanggilToList()
Anda bermain dengan objek, dan kemudian Anda bisa menggunakan konstruktor non-default dalam kueri.Bukan cara penggunaan waktu yang paling efisien, tetapi ini merupakan pilihan pada set kecil.
sumber
ya, coba seperti ini ....
ini akan menambah objek Pembayaran Anda menggunakan konstruktor tanpa parameter, dan kemudian menginisialisasi properti yang tercantum di dalam kurung kurawal
{ }
sumber
()
dalam Payemnts tidak diperlukan, sehingga bisa `pilih Pembayaran baru {// nilai init}Selain metode yang disebutkan di atas, Anda juga dapat menguraikannya sebagai koleksi Enumerable, seperti:
Ini juga memiliki manfaat tambahan untuk membuat hidup lebih mudah ketika membangun objek anonim, seperti ini:
Akan tetapi, mengingat bahwa mem-parsing koleksi saat Enumerable menariknya ke dalam memori, sehingga bisa menjadi sumber daya yang intensif! Perhatian harus digunakan di sini.
sumber
Juga, jika Anda ingin menggunakan konstruktor dengan beberapa objek untuk menginisialisasi, Anda mungkin mendapatkan kesalahan jika tidak ada nilai yang dikembalikan oleh Linq.
Jadi, Anda mungkin ingin melakukan sesuatu seperti ini:
sumber
Maaf karena terlambat ke pesta, tapi saya setelah menemukan ini , saya pikir ini harus dibagikan karena ini adalah implementasi yang paling bersih, tercepat dan juga hemat memori yang bisa saya temukan.
Disesuaikan dengan contoh Anda, Anda akan menulis:
Keuntungan besar di sini (seperti yang ditunjukkan Damien Guard dalam komentar di tautan) adalah:
var foo = createPayments(bar);
serta penggunaan melalui myIQueryable.ToPayments () mungkin.sumber
Saya memiliki masalah yang sama hari ini dan solusi saya mirip dengan apa yang terdaftar di Yoda, namun hanya bekerja dengan sintaks yang lancar.
Menyesuaikan solusi saya ke kode Anda: Saya menambahkan metode statis berikut ke kelas objek
dan kemudian memperbarui kueri dasar sebagai berikut:
Ini secara logis setara dengan solusi James Manning dengan keuntungan mendorong penggelembungan inisialisasi anggota ke Kelas / Objek Transfer Data
Catatan: Awalnya saya menggunakan lebih banyak nama deskriptif yang "Initializer" tetapi setelah meninjau bagaimana saya menggunakannya, saya menemukan bahwa "Initilizer" sudah cukup (setidaknya untuk tujuan saya).
Catatan Akhir:
Setelah menemukan solusi ini, saya awalnya berpikir akan mudah untuk membagikan kode yang sama dan mengadaptasinya agar berfungsi untuk sintaks Query juga. Saya tidak lagi percaya hal itu terjadi. Saya berpikir bahwa jika Anda ingin dapat menggunakan jenis steno konstruksi ini Anda akan memerlukan metode untuk setiap (query, fasih) fasih seperti yang dijelaskan di atas yang dapat ada di kelas objek itu sendiri.
Untuk sintaks kueri diperlukan metode ekstensi (atau beberapa metode di luar kelas dasar yang digunakan). (karena sintaks kueri ingin mengoperasikan IQueryable daripada T)
Berikut adalah contoh dari apa yang saya gunakan untuk akhirnya mendapatkan ini berfungsi untuk sintaks kueri. (Yoda sudah memakukan ini tapi saya pikir penggunaannya bisa lebih jelas karena saya tidak mendapatkannya pada awalnya)
dan penggunaannya
sumber
Meskipun terlambat untuk menjawab, itu masih bisa membantu seseorang dalam kesulitan. Karena LINQ ke entitas tidak mendukung konstruksi objek tanpa parameter. Namun, metode proyeksi untuk IEnumerable .
Jadi sebelum seleksi, konversikan IQueryable Anda ke IEnumerable dengan menggunakan kode ini:
Ini akan bekerja dengan baik. Namun, tentu saja, akan kehilangan manfaat dari kueri asli.
sumber
sumber