Saya memiliki kode berikut:
return this.ObjectContext.BranchCostDetails.Where(
b => b.TarrifId == tariffId && b.Diameter == diameter
|| (b.TarrifId==tariffId && !string.IsNullOrWhiteSpace(b.Diameter))
|| (!b.TarrifId.HasValue) && b.Diameter==diameter);
Dan saya mendapatkan kesalahan ini ketika saya mencoba menjalankan kode:
LINQ to Entities tidak mengenali metode metode 'Boolean IsNullOrWhiteSpace (System.String)', dan metode ini tidak dapat diterjemahkan ke dalam ekspresi toko. "
Bagaimana saya bisa menyelesaikan masalah ini dan menulis kode lebih baik dari ini?
List<string> my = new List<string>(); var i = from m in my where !string.IsNullOrWhiteSpace(m) select m;
Dalam hal ini penting untuk membedakan antara
IQueryable<T>
danIEnumerable<T>
. SingkatnyaIQueryable<T>
diproses oleh penyedia LINQ untuk mengirimkan permintaan yang dioptimalkan. Selama transformasi ini tidak semua pernyataan C # didukung, karena tidak mungkin menerjemahkannya ke kueri spesifik back-end (misalnya SQL) atau karena pelaksana tidak melihat kebutuhan akan pernyataan tersebut.Sebaliknya
IEnumerable<T>
dieksekusi terhadap benda konkret dan, oleh karena itu, tidak akan diubah. Jadi, sangat umum bahwa konstruksi, yang dapat digunakan denganIEnumerable<T>
, tidak dapat digunakan denganIQueryable<T>
dan juga yangIQueryables<T>
didukung oleh penyedia LINQ yang berbeda tidak mendukung serangkaian fungsi yang sama.Namun, ada beberapa solusi (seperti jawaban Phil ), yang mengubah kueri. Juga, sebagai pendekatan yang lebih umum dimungkinkan untuk kembali ke
IEnumerable<T>
sebelum melanjutkan dengan spesifikasi permintaan. Namun, ini mungkin memiliki hit kinerja - terutama ketika menggunakannya pada pembatasan (misalnya di mana klausa). Sebaliknya, ketika berhadapan dengan transformasi, hit kinerja jauh lebih kecil, kadang-kadang bahkan tidak ada - tergantung pada permintaan Anda.Jadi kode di atas juga bisa ditulis ulang seperti ini:
CATATAN: Kode THS akan memiliki dampak kinerja yang lebih tinggi daripada jawaban Phil . Namun, itu menunjukkan prinsipnya.
sumber
Gunakan pengunjung ekspresi untuk mendeteksi referensi ke string.IsNullOrWhiteSpace dan memecahnya menjadi ekspresi yang lebih sederhana
(x == null || x.Trim() == string.Empty)
.Jadi di bawah ini adalah pengunjung tambahan dan metode ekstensi untuk memanfaatkannya. Tidak memerlukan konfigurasi khusus untuk digunakan, cukup panggil WhereEx daripada Where.
Jadi jika Anda menjalankannya
myqueryable.WhereEx(c=> !c.Name.IsNullOrWhiteSpace())
akan dikonversi menjadi!(c.Name == null || x.Trim() == "")
sebelum dilewatkan ke apa pun (LINQ ke sql / entitas) dan dikonversi ke sql.sumber
Anda juga dapat menggunakan ini untuk memeriksa spasi putih:
sumber
akan membuang pengecualian jika
b.Diameter
ininull
.Jika Anda masih ingin menggunakan pernyataan Anda, lebih baik gunakan cek ini
sumber