var items = from c in contacts
select new ListItem
{
Value = c.ContactId, //Cannot implicitly convert type 'int' (ContactId) to 'string' (Value).
Text = c.Name
};
var items = from c in contacts
select new ListItem
{
Value = c.ContactId.ToString(), //Throws exception: ToString is not supported in linq to entities.
Text = c.Name
};
Apakah ada cara saya dapat mencapai ini? Catatan, bahwa dalam VB.NET tidak ada masalah menggunakan cuplikan pertama ini berfungsi dengan baik, VB fleksibel, saya tidak dapat terbiasa dengan kekakuan C # !!!
c#
asp.net
linq-to-entities
tostring
Shimmy Weitzhandler
sumber
sumber
Jawaban:
Dengan EF v4 Anda dapat menggunakan
SqlFunctions.StringConvert
. Tidak ada kelebihan untuk int, jadi Anda harus menggunakan ganda atau desimal. Kode Anda akhirnya terlihat seperti ini:sumber
SqlFunctions.StringConvert((double)c.ContactId).Trim()
Saya memecahkan masalah yang sama dengan menempatkan konversi integer ke string dari kueri. Ini dapat dicapai dengan menempatkan kueri ke dalam objek.
sumber
Gunakan LinqToObject: kontak. AsEnumerable ()
sumber
AsEnumerable
Anda akan membayar harga kinerja tinggi pada database yang lebih besar karena itu akan membawa semuanya dalam memori.IEnumerable
lebih lambat dibandingkan denganIQueryable
karena nanti dieksekusi secara eksklusif dalam database.SqlFunctions.StringConvert akan berfungsi, tetapi saya merasa rumit, dan sebagian besar waktu, saya tidak memiliki kebutuhan nyata untuk melakukan konversi string di sisi SQL.
Apa yang saya lakukan jika saya ingin melakukan manipulasi string adalah melakukan kueri di linq-to-entitas terlebih dahulu, kemudian memanipulasi sengatan di linq-to-object. Dalam contoh ini, saya ingin mendapatkan satu set data yang berisi nama lengkap kontak, dan ContactLocationKey, yang merupakan rangkaian string dari dua kolom Integer (ContactID dan LocationID).
Sekarang, saya yakin bahwa itu tidak praktis untuk harus menulis dua pilihan anonim, tetapi saya berpendapat bahwa ini sebanding dengan kenyamanan di mana Anda dapat melakukan fungsi string (dan lainnya) yang tidak didukung di L2E. Juga perlu diingat bahwa mungkin ada penalti kinerja menggunakan metode ini.
sumber
sumber
return list.ToList();
!!return (from l in db.Customers orderby l.CompanyName select new {Id=l.CustomerID, Name=l.CompanyName}).AsEnumerable().Select(c=> new SelectListItem{Value=c.Id.ToString(), Text = c.Name}).ToList();
. Melakukannya dengan cara ini hanya mendapatkan id / nama dari db (bukan semua properti pelanggan) dan melakukan pengurutan menggunakan indeks yang lebih efisien pada db.Pertama, konversikan ke objek, kemudian toString () akan benar.
sumber
Jawaban Brian Cauthon luar biasa! Hanya sedikit pembaruan, untuk EF 6, kelas dipindahkan ke namespace lain. Jadi, sebelum EF 6, Anda harus memasukkan:
Jika Anda memperbarui ke EF 6, atau hanya menggunakan versi ini, sertakan:
Dengan memasukkan namespace yang salah dengan EF6, kode akan dikompilasi dengan baik tetapi akan menimbulkan kesalahan runtime. Saya harap catatan ini membantu menghindari kebingungan.
sumber
Saya mengalami masalah yang sama ketika saya mengubah aplikasi MVC 2 saya ke MVC 3 dan hanya untuk memberikan solusi (bersih) lain untuk masalah ini saya ingin memposting apa yang saya lakukan ...
GetProducers () hanya mengembalikan koleksi entitas Producers. PS The SqlFunctions.StringConvert tidak bekerja untuk saya.
sumber
Jika "kontak" Anda berfungsi sebagai daftar umum, saya harap kode berikut berfungsi dengan baik.
Terima kasih.
sumber
Satu lagi solusi:
Cukup tambahkan string kosong dan itu akan dikonversi ke string.
sumber
Menggunakan MySql,
SqlFunctions.StringConvert
itu tidak berhasil untuk saya. Karena saya gunakanSelectListItem
di 20+ tempat di proyek saya, saya menginginkan solusi yang berfungsi tanpa memutarbalikkan 20+ pernyataan LINQ. Solusi saya adalah untuk sub-kelasSelectedListItem
untuk menyediakan integer setter, yang memindahkan konversi tipe dari LINQ. Jelas, solusi ini sulit untuk digeneralisasi, tetapi cukup membantu untuk proyek spesifik saya.Untuk menggunakan, buat tipe berikut dan gunakan dalam kueri LINQ Anda di tempat
SelectedListItem
dan gunakan IntValue sebagai pengganti Value.sumber
Jika Anda menggunakan kerangka entitas dan Anda ingin membuat int hanya dapat diterima maka Anda dapat menggunakan ini dalam permintaan LINQ Anda dapat mencoba ini
ini akan berfungsi karena menggunakan (int) akan memberikan nilai Anda ke int sehingga Anda tidak perlu konversi untuk string ke int dan Anda mendapatkan hasil yang Anda inginkan.
ini bekerja untuk saya dalam proyek saya, saya pikir ini akan membantu Anda
sumber
Pemahaman saya adalah bahwa Anda harus membuat kelas parsial untuk "memperluas" model Anda dan menambahkan properti yang hanya bisa dibaca yang dapat memanfaatkan sisa properti kelas.
Kemudian
sumber
Saya menemukan itu
SqlFunctions.StringConvert((double)c.Age)
tidak bekerja untuk saya baik bidangnya tipeNullable<Int32>
Butuh banyak pencarian selama beberapa hari terakhir untuk menemukan ini.
Saya harap ini membantu beberapa coders di luar sana.
sumber
System.String Concat(System.Object)
tidak dapat diterjemahkan ke dalam ekspresi toko ... ".Bisakah kamu mencoba:
sumber