Loại thành viên được chỉ định 'Ngày' không được hỗ trợ trong LINQ to Entities. Chỉ các công cụ khởi tạo, thành viên thực thể và thuộc tính điều hướng thực thể


138

Sử dụng mã này trong Entity Framework tôi nhận được lỗi sau. Tôi cần nhận tất cả các hàng cho một ngày cụ thể, DateTimeStartthuộc loại DataType theo định dạng này2013-01-30 12:00:00.000

Mã số:

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

Lỗi:

cơ sở {System.SystemException} = {"Thành viên loại được chỉ định 'Ngày' không được hỗ trợ trong LINQ cho các thực thể. Chỉ có các trình khởi tạo, thành viên thực thể và thuộc tính điều hướng thực thể được hỗ trợ."}

làm thế nào để khắc phục các ý tưởng đó?


Tôi có thể sử dụng x.DateTimeStart.Date trong EF Core 2.1.1
Kirsten Greed

Câu trả lời:


271

DateTime.Datekhông thể được chuyển đổi sang SQL. Sử dụng phương thức EntityFifts.TruncateTime để lấy phần ngày.

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

CẬP NHẬT: Như @shankbond đã đề cập trong các bình luận, trong Entity Framework 6 EntityFunctionsđã lỗi thời và bạn nên sử dụng DbFunctionslớp, được phân phối với Entity Framework.


1
Tôi phải sửa đổi một chút phiên bản của bạn .Where (x => EntityFifts.TruncateTime (x.DateTimeStart) == currentDate.Date); hãy cho tôi biết những người bạn của bạn
GibboK

1
Tôi hy vọng bạn không phiền Tôi đã chỉnh sửa câu trả lời của bạn thêm .date nếu bạn đồng ý, vì vậy chỉ để tham khảo :-) cảm ơn sự hỗ trợ của bạn, tôi thực sự đánh giá cao nó
GibboK

1
@GibboK chắc chắn, không có vấn đề gì :) Đó chỉ là mục đích định dạng chuỗi dài.
Serge Berezovskiy

68
EntityFifts đã lỗi thời, thay vào đó hãy sử dụng phương thức
DbFifts.TruncateTime

1
Loại thành viên được chỉ định 'Ngày' không được hỗ trợ trong LINQ to Entities. Chỉ các phần khởi tạo, thành viên thực thể và thuộc tính điều hướng thực thể được hỗ trợ.
SAR

83

Bây giờ bạn nên sử dụng DbFunctions.TruncateTime

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


Loại thành viên được chỉ định 'Ngày' không được hỗ trợ trong LINQ to Entities. Chỉ các phần khởi tạo, thành viên thực thể và thuộc tính điều hướng thực thể được hỗ trợ.
SAR

17

Tôi muốn thêm một giải pháp, giúp tôi giải quyết vấn đề này trong khung thực thể:

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

Tôi hy vọng rằng nó sẽ giúp.


15

EntityFunctionsLà lỗi thời. Hãy xem xét sử dụng DbFunctionsthay thế.

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

8

Luôn sử dụng EntityFifts.TruncateTime () cho cả x.DateTimeStart và currentDate. nhu la :

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

5

Chỉ cần sử dụng các thuộc tính đơn giản.

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

Nếu ngày trong tương lai không thể có trong ứng dụng của bạn, thì > = x.DateTimeStart> = currentDateTime.Date là đủ.

nếu bạn có các so sánh ngày phức tạp hơn, thì hãy kiểm tra các chức năng Canonical và nếu bạn có các chức năng DB6 + DB

Tổng quát hơn - Đối với những người tìm kiếm các vấn đề Các phương thức Linq được hỗ trợ trong EF có thể giải thích các vấn đề tương tự với các câu lệnh linq hoạt động trên Danh sách cơ sở bộ nhớ nhưng không phải trong EF.


3

Giản thể:

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

2

Sử dụng mã dưới đây để sử dụng EF6:

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

0

Một giải pháp khác có thể là:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.