Saya memigrasikan beberapa hal dari satu server mysql ke server sql tetapi saya tidak tahu cara membuat kode ini berfungsi:
using (var context = new Context())
{
...
foreach (var item in collection)
{
IQueryable<entity> pages = from p in context.pages
where p.Serial == item.Key.ToString()
select p;
foreach (var page in pages)
{
DataManager.AddPageToDocument(page, item.Value);
}
}
Console.WriteLine("Done!");
Console.Read();
}
Ketika masuk ke yang kedua foreach (var page in pages)
itu melempar pengecualian mengatakan:
LINQ ke Entitas tidak mengenali metode metode 'System.String ToString ()', dan metode ini tidak dapat diterjemahkan ke dalam ekspresi toko.
Adakah yang tahu mengapa ini terjadi?
Jawaban:
Simpan saja string ke variabel temp dan gunakan dalam ekspresi Anda:
Masalah muncul karena
ToString()
tidak benar-benar dieksekusi, itu berubah menjadi MethodGroup dan kemudian diuraikan dan diterjemahkan ke SQL. Karena tidak ada yangToString()
setara, ekspresi gagal.catatan:
Pastikan Anda juga memeriksa jawaban Alex mengenai
SqlFunctions
kelas pembantu yang ditambahkan kemudian. Dalam banyak kasus dapat menghilangkan kebutuhan untuk variabel sementara.sumber
ToString()
bukan salah satunya.ExecuteQuery
atau dengan menggunakan Entity SQL denganObjectQuery<T>
Seperti orang lain telah menjawab, ini rusak karena. ToString gagal menerjemahkan ke SQL yang relevan dalam perjalanan ke database.
Namun, Microsoft menyediakan kelas SqlFunctions yang merupakan kumpulan metode yang dapat digunakan dalam situasi seperti ini.
Untuk kasus ini, apa yang Anda cari di sini adalah SqlFunctions.StringConvert :
Baik ketika solusi dengan variabel sementara tidak diinginkan karena alasan apa pun.
Mirip dengan SqlFunctions Anda juga memiliki EntityFunctions (dengan EF6 usang oleh DbFunctions ) yang menyediakan serangkaian fungsi berbeda yang juga merupakan sumber data agnostik (tidak terbatas pada misalnya SQL).
sumber
Masalahnya adalah bahwa Anda memanggil ToString di kueri LINQ to Entities. Itu berarti parser sedang mencoba untuk mengubah panggilan ToString menjadi SQL yang setara (yang tidak mungkin ... maka pengecualian).
Yang harus Anda lakukan adalah memindahkan panggilan ToString ke saluran terpisah:
sumber
Punya masalah serupa. Memecahkannya dengan memanggil ToList () pada koleksi entitas dan menanyakan daftar. Jika koleksinya kecil ini adalah opsi.
Semoga ini membantu.
sumber
Ubah seperti ini dan seharusnya berfungsi:
Alasan mengapa pengecualian tidak dilemparkan di baris permintaan LINQ dideklarasikan tetapi di baris
foreach
adalah fitur eksekusi yang ditangguhkan, yaitu permintaan LINQ tidak dieksekusi sampai Anda mencoba mengakses hasilnya. Dan ini terjadi diforeach
dan bukan sebelumnya.sumber
Cast table to
Enumerable
, lalu Anda memanggil metode LINQ dengan menggunakanToString()
metode di dalam:Tapi hati-hati, ketika Anda menelepon
AsEnumerable
atauToList
metode karena Anda akan meminta semua data dari semua entitas sebelum metode ini. Dalam kasus saya di atas, saya membaca semuatable_name
baris dengan satu permintaan.sumber
Memutakhirkan ke Entity Framework Versi 6.2.0 bekerja untuk saya.
Saya sebelumnya di Versi 6.0.0.
Semoga ini membantu,
sumber
Di MVC, anggap Anda sedang mencari catatan berdasarkan kebutuhan atau informasi Anda. Ini berfungsi dengan baik.
sumber
Jika Anda benar-benar ingin mengetik
ToString
di dalam kueri Anda, Anda bisa menulis pengunjung pohon ekspresi yang menulis ulang panggilanToString
dengan panggilan keStringConvert
fungsi yang sesuai :sumber
First
sini adalah pada hasilGetMethods()
yang kembaliMethodInfo[]
. AFAIK,MethodInfo[]
tidak memilikiFind
metode, juga tidak ada metode ekstensi seperti itu. Tetapi saya benar-benar harus menggunakanSingle
karena metode ini ditemukan melalui refleksi, dan tidak akan ada kesalahan waktu kompilasi jika metode yang sesuai tidak dapat diselesaikan.Saya mendapat kesalahan yang sama dalam hal ini:
Setelah menghabiskan terlalu banyak waktu untuk debugging, saya menemukan kesalahan yang muncul dalam ekspresi logika.
Baris pertama
search.Contains(log.Id.ToString())
tidak berfungsi dengan baik, tetapi baris terakhir yang berhubungan dengan objek DateTime membuatnya gagal total:Hapus garis yang bermasalah dan masalah dipecahkan.
Saya tidak sepenuhnya mengerti mengapa, tetapi sepertinya ToString () adalah ekspresi LINQ untuk string, tetapi tidak untuk Entitas. LINQ untuk Entitas berhubungan dengan permintaan basis data seperti SQL, dan SQL tidak memiliki gagasan ToString (). Dengan demikian, kita tidak bisa melempar ToString () ke klausa .Where ().
Tetapi bagaimana cara kerja baris pertama? Alih-alih ToString (), SQL punya
CAST
danCONVERT
, jadi tebakan terbaik saya sejauh ini adalah bahwa LINQ untuk entitas menggunakan itu dalam beberapa kasus sederhana. Objek DateTime tidak selalu ditemukan sesederhana itu ...sumber
Cukup putar LINQ menjadi kueri Entitas menjadi kueri LINQ ke Objek (mis. Panggil ToArray) kapan saja Anda perlu menggunakan pemanggilan metode dalam kueri LINQ Anda.
sumber