ประเภทสมาชิกที่ระบุ 'วันที่' ไม่ได้รับการสนับสนุนใน LINQ ไปยังเอนทิตี เฉพาะผู้เริ่มต้นสมาชิกเอนทิตีและคุณสมบัติการนำทางเอนทิตี


138

การใช้รหัสนี้ในEntity Frameworkฉันได้รับข้อผิดพลาดดังต่อไปนี้ ฉันต้องการรับแถวทั้งหมดสำหรับวันที่ระบุDateTimeStartเป็นประเภท DataType ในรูปแบบนี้2013-01-30 12:00:00.000

รหัส:

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

ข้อผิดพลาด:

base {System.SystemException} = {"สมาชิกประเภทที่ระบุ 'Date' ไม่ได้รับการสนับสนุนใน LINQ ไปยัง Entities สนับสนุนเฉพาะ initializers, สมาชิกเอนทิตีและคุณสมบัติการนำทางเอนทิตี"}

ความคิดใด ๆ วิธีการแก้ไขหรือไม่


ฉันสามารถใช้ x.DateTimeStart.Date ใน EF Core 2.1.1 ได้
Kirsten Greed

คำตอบ:


271

DateTime.Dateไม่สามารถแปลงเป็น SQL ได้ ใช้วิธีEntityFunctions.TruncateTimeเพื่อรับส่วนวันที่

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

UPDATE: @shankbond ที่กล่าวถึงในความคิดเห็นใน Entity Framework 6 EntityFunctionsล้าสมัยแล้วและคุณควรใช้DbFunctionsคลาสที่มาพร้อมกับ Entity Framework


1
ฉันต้องแก้ไขเวอร์ชันของคุณเล็กน้อยที่นี่ (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date ปัจจุบัน) ให้ฉันรู้ว่าเจ้า
GibboK

1
ฉันหวังว่าคุณจะไม่รังเกียจฉันได้แก้ไขคำตอบของคุณเพิ่มวันที่ถ้าคุณเห็นด้วยดังนั้นเพียงสำหรับการอ้างอิง :-) ขอบคุณสำหรับการสนับสนุนของคุณฉันขอขอบคุณจริงๆ
GibboK

1
@ GibboK แน่นอนไม่มีปัญหา :) นั่นเป็นเพียงเพื่อวัตถุประสงค์ในการจัดรูปแบบสตริงยาว
Sergey Berezovskiy

68
EntityFunctions เป็นล้าสมัยแทนที่จะใช้วิธีการ DbFunctions.TruncateTime
shankbond

1
ประเภทสมาชิกที่ระบุ 'วันที่' ไม่ได้รับการสนับสนุนใน LINQ ไปยังเอนทิตี สนับสนุนเฉพาะ initializers, สมาชิกเอนทิตีและคุณสมบัติการนำทางเอนทิตี
SAR

83

ตอนนี้คุณควรใช้ DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();


ประเภทสมาชิกที่ระบุ 'วันที่' ไม่ได้รับการสนับสนุนใน LINQ ไปยังเอนทิตี สนับสนุนเฉพาะ initializers, สมาชิกเอนทิตีและคุณสมบัติการนำทางเอนทิตี
SAR

17

ฉันต้องการเพิ่มวิธีแก้ปัญหาที่ช่วยให้ฉันแก้ปัญหานี้ในกรอบงานเอนทิตี:

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

ผมหวังว่ามันจะช่วย.


15

EntityFunctionsล้าสมัยแล้ว พิจารณาใช้DbFunctionsแทน

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

8

ใช้ EntityFunctions.TruncateTime () สำหรับทั้ง x.DateTimeStart และ currentDate เสมอ เช่น:

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

5

เพียงใช้คุณสมบัติที่เรียบง่าย

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

หากวันที่ในอนาคตเป็นไปไม่ได้ในแอปของคุณดังนั้น> = x.DateTimeStart> = currentDateTime.Dateเพียงพอ

หากคุณมีการเปรียบเทียบวันที่ที่ซับซ้อนมากขึ้นให้ตรวจสอบฟังก์ชั่น Canonical และถ้าคุณมีฟังก์ชั่น EF6 + DB

เพิ่มเติมโดยทั่วไป - สำหรับผู้ที่ค้นหาปัญหาวิธีการ Linq ที่รองรับใน EF สามารถอธิบายปัญหาที่คล้ายกันกับคำสั่ง linq ที่ทำงานในรายการฐานความจำ แต่ไม่ใช่ใน EF




0

ทางออกอื่นอาจเป็น:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.