Cara mengembalikan anonim jenis dari c# metode yang menggunakan LINQ untuk SQL

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 };
    }
Mengomentari pertanyaan (4)
Larutan

Membuat anonim jenis ke kelas...

public class Person
{
    public Person() {
    }

    public String Name { get; set; }
    public DateTime DOB { get; set; }
}

Person p = 
    from person in db.People 
    where person.Id = 1 
    select new Person { 
        Name = person.Name,
        DOB = person.DateOfBirth
    }
Komentar (8)

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

  1. Memiliki return type dari method menjadi Sistem.Objek. Anda kemudian dapat melakukan kejahatan casting hacks untuk mendapatkan diketik nilai dalam metode lain. Ini adalah sangat rapuh dan aku don't merekomendasikan hal ini.
  2. Menggunakan metode generik dan jenis inferensi trik untuk mendapatkan kembali jenis yang benar. Ini akan membutuhkan waktu yang sangat menarik signature definisi untuk pendekatan anda.

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.

Komentar (2)

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:

var person = new Person { Name = "bob" };

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:

var person = new { Name = "bob" };

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.

Komentar (4)

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.

Komentar (4)

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.

Komentar (0)

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.

Komentar (0)