Saya mendapat pengecualian saat menerapkan pernyataan berikut.
DateTime result;
if (!DateTime.TryParse(rule.data, out result))
return jobdescriptions;
if (result < new DateTime(1754, 1, 1)) // sql can't handle dates before 1-1-1753
return jobdescriptions;
return jobdescriptions.Where(j => j.JobDeadline.Date == Convert.ToDateTime(rule.data).Date );
Pengecualian
The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
Saya tahu apa arti pengecualian itu tetapi saya tidak tahu bagaimana cara menyingkirkannya. Ada bantuan?
.Date
.Jawaban:
LINQ ke Entitas tidak dapat menerjemahkan sebagian besar metode .NET Date (termasuk casting yang Anda gunakan) ke dalam SQL karena tidak ada SQL yang setara.
Solusinya adalah dengan menggunakan metode Tanggal di luar pernyataan LINQ dan kemudian memasukkan nilai. Tampaknya Convert.ToDateTime (rule.data) .Date yang menyebabkan kesalahan.
Memanggil Tanggal pada properti DateTime juga tidak dapat diterjemahkan ke SQL, jadi solusinya adalah membandingkan properti .Year .Month dan .Day yang dapat diterjemahkan ke LINQ karena hanya bilangan bulat.
sumber
j.JobDeadline.Date
?Anda dapat menggunakan metode TruncateTime dari EntityFunctions untuk mendapatkan terjemahan
Date
properti yang benar ke dalam SQL:Pembaruan:
EntityFunctions
tidak digunakan lagi di EF6, GunakanDbFunctions.TruncateTime
sumber
ruleData
adalahDateTime
tipe danj.JobDeadline
memiliki waktu terpotong. Tidak terasa benar. Tidak mendapatkan pengecualian tetapi juga tidak mendapatkan hasil yang diharapkan.JobDeadline
memiliki sama tanggal sebagairule.data
, tidak peduli apa waktu hari . Bukankah itu yang ingin Anda capai dengan pertanyaan Anda? Mengapa tidak terasa benar?EntityFunctions
EF6 sudah tidak digunakan lagi, sekarang Anda harus menggunakanDbFunctions
.System.Data.Entity
: msdn.microsoft.com/en-us/library/Dn220142(v=VS.113).aspxUntuk EF6 gunakan DbFunctions.TruncateTime (mydate) sebagai gantinya.
sumber
"EntityFunctions.TruncateTime" atau "DbFunctions.TruncateTime" di ef6 Berfungsi tetapi memiliki beberapa masalah kinerja di Big Data.
Saya pikir cara terbaik adalah bertindak seperti ini:
itu lebih baik daripada menggunakan bagian dari tanggal untuk. karena kueri dijalankan lebih cepat dalam data besar.
sumber
EntityFunctions.TruncateTime
(kemudian diganti denganDbFunctions.TruncateTime
) diimplementasikan dengan mengonversi ke SQL di mana tanggalwaktu diubah menjadi string dan dipotong. Ini membuat kueri berjalan jauh lebih lambat, sebanding dengan jumlah rekaman yang diproses.Perlu disertakan
using System.Data.Entity;
. Bekerja dengan baik bahkan denganProjectTo<>
sumber
Artinya adalah LINQ ke SQL tidak tahu bagaimana mengubah
Date
properti menjadi ekspresi SQL. Ini karenaDate
propertiDateTime
struktur tidak memiliki analog dalam SQL.sumber
Itu berhasil untuk saya.
Sumber: Forum Asp.net
sumber
Saya memiliki masalah yang sama tetapi saya bekerja dengan DateTime-Ranges. Solusi saya adalah memanipulasi waktu mulai (dengan tanggal berapa pun) menjadi 00:00:00 dan waktu akhir menjadi 23:59:59 Jadi saya tidak boleh lagi mengubah DateTime saya menjadi Date, melainkan tetap DateTime.
Jika Anda hanya memiliki satu DateTime, Anda juga dapat menyetel waktu mulai (dengan tanggal apa pun) ke 00:00:00 dan waktu akhir ke 23:59:59. Kemudian Anda mencari seolah-olah itu adalah rentang waktu.
Anda juga dapat melakukannya dengan DateTime-Range:
sumber
Anda bisa mendapatkan Enum seperti:
sumber
Seperti yang telah ditunjukkan oleh banyak orang di sini, penggunaan fungsi TruncateTime berjalan lambat.
Opsi termudah jika Anda bisa adalah menggunakan EF Core. Itu bisa melakukan ini. Jika Anda tidak bisa, maka alternatif yang lebih baik untuk memotong adalah dengan tidak mengubah bidang kueri sama sekali, tetapi memodifikasi batasnya. Jika Anda melakukan kueri tipe 'antara' normal di mana batas bawah dan atas adalah opsional, berikut ini akan melakukan triknya.
Pada dasarnya, daripada memangkas PoDate kembali ke hanya bagian Tanggal, kami menaikkan batas kueri atas dan pengguna <bukannya <=
sumber