Saya memiliki dua nilai tanggal, satu sudah disimpan dalam database dan yang lainnya dipilih oleh pengguna menggunakan DatePicker. Kasus penggunaan adalah untuk mencari tanggal tertentu dari database.
Nilai yang sebelumnya dimasukkan ke dalam database selalu memiliki komponen waktu 12:00:00, sedangkan tanggal yang dimasukkan dari alat pilih memiliki komponen waktu yang berbeda.
Saya hanya tertarik pada komponen tanggal dan ingin mengabaikan komponen waktu.
Apa cara untuk melakukan perbandingan ini di C #?
Juga, bagaimana melakukan ini di LINQ?
UPDATE: Pada LINQ ke Entitas, berikut ini berfungsi dengan baik.
e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0
Jawaban:
CATATAN: pada saat menulis jawaban ini, hubungan EF tidak jelas (yang diedit ke dalam pertanyaan setelah ini ditulis). Untuk pendekatan yang benar dengan EF, periksa jawaban Mandeeps .
Anda dapat menggunakan
DateTime.Date
properti untuk melakukan perbandingan khusus tanggal.sumber
EntityFunctions.TruncateTime
tampaknya pasti cara untuk pergi hari ini (itu menjadi tersedia di .NET 4 yang dirilis setahun setelah pertanyaan ini diajukan).Gunakan kelas
EntityFunctions
untuk memangkas porsi waktu.Sumber: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/
MEMPERBARUI
Mulai EF 6.0 dan yang lebih baru, EntityFunctions digantikan oleh DbFunctions .
sumber
EntityFunctions
sudah usang dan mendukungSystem.Data.Entity.DbFunctions
untuk (setidaknya) EF6. Mungkin lebih awal dari ini.Saya pikir ini bisa membantu Anda.
Saya membuat perpanjangan karena saya harus membandingkan tanggal di repositori yang diisi dengan data EF dan sebagainya. Tanggal bukanlah pilihan karena tidak diterapkan dalam terjemahan LinqToEntities.
Ini kodenya:
maka Anda bisa menggunakannya dengan cara ini.
sumber
Jika Anda menggunakan
Date
properti untuk Entitas DB, Anda akan mendapatkan pengecualian:Anda dapat menggunakan sesuatu seperti ini:
sumber
Untuk melakukannya di LINQ ke Entitas, Anda harus menggunakan metode yang didukung :
Jelek, tetapi berhasil, dan itu dilakukan di server DB.
sumber
Berikut cara berbeda untuk melakukannya, tetapi ini hanya berguna jika SecondDate adalah variabel yang Anda teruskan:
Saya pikir itu seharusnya berhasil
sumber
DateTime = x.Date;
saya lewatkan. Jika saya menggunakanvar
, atau memiliki nilai sebaris dalam perbandingan itu gagal dengan pengecualian yang dilaporkan. Terima kasih.e.FirstDate.Value <= endDate
menjadie.FirstDate.Value < endDate
Anda dapat menghapus.AddTicks(-1)
.Anda juga dapat menggunakan ini:
DbFunctions.DiffDays(date1, date2) == 0
sumber
Anda bisa menggunakan metode DbFunctions.TruncateTime () untuk ini.
sumber
Selalu bandingkan properti Date dari DateTime, bukan waktu tanggal penuh.
Saat Anda membuat kueri LINQ, gunakan tanggal.Date dalam kueri, yaitu:
sumber
candidate.Date >= base.Date
. Secara teoritis,candidate.Date
waktunya harus> = 12:00:00, jadi menggunakan properti Date berlebihan, tapi saya akan tetap mengikuti saran Reed.Beginilah cara saya melakukan ini.
sumber
// Catatan untuk Pengguna / Pembuat Kode Linq
Ini akan memberi Anda perbandingan yang tepat untuk memeriksa apakah suatu tanggal berada dalam kisaran saat bekerja dengan masukan dari pemilih tanggal pengguna misalnya:
dengan tanggal mulai dan tanggal akhir adalah nilai dari pemilih tanggal.
sumber
Tanpa waktu selain mencoba seperti ini:
sumber
Anda dapat menggunakan tautan di bawah ini untuk membandingkan 2 tanggal tanpa waktu:
Fungsi Compare mengembalikan 3 nilai berbeda: -1 0 1 yang berarti dt1> dt2, dt1 = dt2, dt1
sumber
Coba ini ... Ini berfungsi dengan baik untuk membandingkan properti Tanggal antara dua jenis DateTimes:
PS. Ini adalah solusi sementara dan praktik yang sangat buruk, tidak boleh digunakan ketika Anda tahu bahwa database dapat membawa ribuan catatan ...
sumber