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?


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.


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();


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.


15

EntityFunctionssudah usang. Pertimbangkan untuk menggunakan DbFunctionssebagai gantinya.

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

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));

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.


3

Sederhana:

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

2

Gunakan kode di bawah ini untuk menggunakan EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)

0

Solusi lain bisa jadi:

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

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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.