Cara mengembalikan anonim jenis dari c# metode yang menggunakan LINQ untuk SQL
Mungkin Duplikat: LINQ untuk SQL: Kembali anonim jenis?
Saya memiliki standar LINQ untuk SQL query, yang mengembalikan data-data sebagai anonim jenis (mengandung sekitar 6 kolom data dari berbagai tipe data).
Saya ingin membuat ini kembali objek yang tersedia untuk bagian lain dari program ini, baik dengan kembali ke metode-pemanggil, atau dengan menetapkan properti dari objek yang berisi metode.
Bagaimana saya dapat melakukan hal ini mengingat bahwa itu adalah anonim jenis ("var")?
EDIT - Berikut ini adalah kode:
using (ormDataContext context = new ormDataContext(connStr))
{
var electionInfo = from t1 in context.elections
join t2 in context.election_status
on t1.statusID equals t2.statusID
select new { t1, t2 };
}
44
6
Membuat anonim jenis ke kelas...
Anda tidak dapat mengetik apapun metode dalam C# untuk menjadi eksplisit jenis anonim jenis. Mereka tidak bisa menjadi "bernama" sehingga untuk berbicara dan karenanya tidak muncul dalam metadata tanda tangan.
Jika anda benar-benar ingin mengembalikan nilai yang anonim jenis ada 2 pilihan
Anonim jenis-jenis itu tidak benar-benar dimaksudkan untuk diedarkan dalam mode ini. Pada titik yang anda butuhkan untuk melewati mereka di sekitar antara fungsi dengan cara ini, anda're lebih baik secara eksplisit mendefinisikan jenis.
Menggunakan var doesn't membuat anonim jenis. Menggunakan var hanya berarti biarkan hal ini menjadi variabel dari jenis yang tersedia di sisi kanan dari tugas. It's hanya tangan pendek. Jika hal pada sisi kanan adalah kelas nyata, variabel akan dari jenis yang.
Misalnya:
Orang variabel adalah tipe Orang yang, meskipun menggunakan kata kunci var.
Anonim jenis yang dibuat menggunakan baru { Nama = ... }. Dalam hal ini's baru, anonim kelas. Satu-satunya hal yang anda dapat menetapkan variabel yang didefinisikan menggunakan var (atau objek) karena tidak ada nama yang akan digunakan.
Misalnya:
Dalam hal ini, seseorang anonim tipe yang didefinisikan pada waktu berjalan.
Umumnya, seperti @Chalkey mengatakan, jika anda ingin lulus hasilnya kembali ke metode lain, menggunakan tipe bernama, tidak anonim satu.
Jika anda dipaksa untuk menggunakan anonim jenis, anda'll harus melewati kembali sebagai objek dari jenis
Objek
, kemudian menggunakan refleksi untuk mendapatkan hal itu's properties.Jon Skeet menulis sebuah blog tentang cara untuk melakukan hal ini, yang cukup tepat yang berjudul Mengerikan Kumuh Hack. Sama seperti judulnya, anda benar-benar tidak't akan mencari cara untuk kembali anonim jenis. Sebaliknya, anda harus menciptakan jenis yang dapat dikembalikan seperti ini adalah cara yang benar untuk menerapkan fitur ini.
Oleh karena itu, saya sarankan anda membuat beton definisi jenis dikembalikan dan kemudian mengisi dalam permintaan anda untuk itu untuk dikembalikan.
Itu tergantung pada berapa kode panggilan akan menggunakan data.
Jika anda melakukan mengikat data sederhana, yang benar-benar don't peduli tentang jenis (yaitu anda don't harus secara eksplisit akses sifat dalam kode C#), anda dapat menyampaikan kembali hasil sebagai IEnumberable.
Dalam kebanyakan databinding kasus anda menelepon sifat berdasarkan nama, melalui sihir string, jadi tepat jenis doesn't peduli pula.
Jika tidak, anda perlu mengkonversi anonim tipe ke tipe bernama.
Jika anda harus melewati sekitar hasil besar aplikasi yang dapat anda gunakan Kamus<string,objek>. Ya, anda memiliki beberapa overhead ketika casting tapi setidaknya anda mengurangi anda membuang benda-benda.