Jenis anggota 'Tanggal' tidak didukung di LINQ untuk Entitas. Hanya penginisialisasi, anggota entitas, dan properti navigasi entitas

141

Menggunakan kode ini di Entity Framework saya menerima galat berikut. Saya perlu mendapatkan semua baris untuk tanggal tertentu, DateTimeStartadalah tipe DataType dalam format ini2013-01-30 12:00:00.000

Kode:

 var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                    .Where(x =>  x.DateTimeStart.Date == currentDateTime.Date);

Kesalahan:

base {System.SystemException} = {"Jenis anggota 'Tanggal' yang ditentukan tidak didukung di LINQ untuk Entitas. Hanya penginisialisasi, anggota entitas, dan properti navigasi entitas yang didukung."}

Ada ide bagaimana cara memperbaikinya?

GibboK
sumber
Saya dapat menggunakan x.DateTimeStart.Date di EF Core 2.1.1
Kirsten Greed

Jawaban:

275

DateTime.Datetidak dapat dikonversi ke SQL. Gunakan metode EntityFunctions.TruncateTime untuk mendapatkan tanggal part.

var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

PEMBARUAN: Seperti yang disebutkan @shankbond dalam komentar, di Entity Framework 6 EntityFunctionssudah usang, dan Anda harus menggunakan DbFunctionskelas, yang dikirimkan dengan Entity Framework.

Sergey Berezovskiy
sumber
1
Saya harus sedikit memodifikasi versi Anda .Where (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date); beri tahu saya pendapat Anda
GibboK
1
Saya harap Anda tidak keberatan saya telah mengedit jawaban Anda dengan menambahkan .date jika Anda setuju, jadi hanya untuk referensi :-) terima kasih atas dukungan Anda, saya sangat menghargainya
GibboK
1
@GibboK tentu, tidak masalah :) Itu hanya untuk tujuan memformat string panjang.
Sergey Berezovskiy
69
EntityFunctions sudah usang, sebagai gantinya gunakan metode
DbFunctions.TruncateTime
1
Jenis anggota 'Tanggal' tidak didukung di LINQ untuk Entitas. Hanya penginisialisasi, anggota entitas, dan properti navigasi entitas yang didukung.
SAR
84

Anda sekarang harus menggunakan DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();
WaZ
sumber
Jenis anggota 'Tanggal' tidak didukung di LINQ untuk Entitas. Hanya penginisialisasi, anggota entitas, dan properti navigasi entitas yang didukung.
SAR
18

Saya ingin menambahkan solusi, yang telah membantu saya menyelesaikan masalah ini dalam kerangka entitas:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                .Where(x =>  x.DateTimeStart.Year == currentDateTime.Year &&
                             x.DateTimeStart.Month== currentDateTime.Month &&
                             x.DateTimeStart.Day == currentDateTime.Day
    );

Saya harap ini membantu.

jvrdelafuente
sumber
15

EntityFunctionssudah usang. Pertimbangkan untuk menggunakan DbFunctionssebagai gantinya.

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
Leonel Sanches da Silva
sumber
8

Selalu gunakan EntityFunctions.TruncateTime () untuk x.DateTimeStart dan currentDate. seperti :

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));
Babul Mirdha
sumber
5

Cukup gunakan properti sederhana.

var tomorrow = currentDateTime.Date + 1;  
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                            .Where(x =>  x.DateTimeStart >= currentDateTime.Date 
                                   and x.DateTimeStart < tomorrow);

Jika tanggal di masa mendatang tidak memungkinkan dalam aplikasi Anda, maka > = x.DateTimeStart> = currentDateTime.Date sudah cukup.

jika Anda memiliki perbandingan tanggal yang lebih kompleks, periksa fungsi Canonical dan jika Anda memiliki fungsi EF6 + DB

Lebih Umum - Untuk orang yang mencari masalah Metode Lini yang Didukung di EF dapat menjelaskan masalah serupa dengan pernyataan LINQ yang bekerja pada Daftar basis Memori tetapi tidak di EF.

phil soady
sumber
3

Sederhana:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();
devlin anyelir
sumber
2

Gunakan kode di bawah ini untuk menggunakan EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
Abdus Salam Azad
sumber
0

Solusi lain bisa jadi:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
cozmin-calin
sumber
0

Saya memiliki masalah yang sama dengan Entity Framework 6.1.3

Namun dengan skenario yang berbeda. Properti model saya adalah tipe nullableDateTime

DateTime? CreatedDate { get; set; }

Jadi saya perlu menanyakan tanggal hari ini untuk memeriksa semua catatan, jadi ini yang berhasil untuk saya. Yang berarti saya perlu memotong kedua catatan untuk mendapatkan kueri yang tepat DbContext:

Where(w => DbFunctions.TruncateTime(w.CreatedDate) == DbFunctions.TruncateTime(DateTime.Now);
Willy David Jr
sumber