2013-02-08 46 views
9

Tôi chỉ cần so sánh ngày tháng trong truy vấn LINQ có liên quan đến trường datetime. Tuy nhiên, cú pháp bên dưới kết quả trong các thông báo lỗi sauSử dụng truy vấn LINQ để so sánh ngày chỉ với trường DateTime

The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

Có ai biết làm thế nào để chỉ trích ngày ra khỏi một lĩnh vực datetime?

var duplicate = from a in _db.AgentProductTraining 
       where a.CourseCode == course.CourseCode && 
       a.DateTaken.Date == course.DateTaken.Date && 
       a.SymNumber == symNumber 
       select a; 

Trả lời

14

Dường như có một vòng xoay nhỏ, nhưng bạn có thể sử dụng phương thức SqlFunctions 'DateDiff để thực hiện việc này. Chỉ cần vượt qua cả hai giá trị và sử dụng "Ngày" để tìm sự khác biệt giữa chúng trong ngày (sẽ là 0 nếu chúng ở cùng ngày).

Giống như sau:

from a in _db.AgentProductTraining 
       where a.CourseCode == course.CourseCode && 
       SqlFunctions.DateDiff("DAY", a.DateTaken, course.DateTaken) == 0 && 
       a.SymNumber == symNumber 
       select a; 
+0

Không khác biệt nếu ngày tháng vào các ngày khác nhau, nhưng được đặt cách nhau ít hơn một ngày, ví dụ: 'Jan-5, 2013 23: 30: 00' và 'Jan-6, 2013 01:30: 00'? – dasblinkenlight

+0

Tôi không tin như vậy: http://www.sqlteam.com/article/datediff-function-demystified – IronMan84

+1

Cảm ơn bạn đã liên kết! – dasblinkenlight

1

thử này

DateTime dt =course.DateTaken.Date; 
var duplicate = from a in _db.AgentProductTraining 
       where a.CourseCode == course.CourseCode && 
       a.DateTaken == dt && 
       a.SymNumber == symNumber 
       select a; 

nếu a.DateTaken chứa Time cũng có, sau đó tham khảo những liên kết này để sửa đổi ngày của bạn.
Thuộc tính Ngày không thể được sử dụng trong LINQ To Entities.

Compare Dates using LINQ to Entities (Entity Framework)

'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported

http://forums.asp.net/t/1793337.aspx/1

9

Bạn có thể sử dụng EntityFunctions.TruncateTime() dưới namespace System.Data.Objects

Ex.

db.Orders.Where(i => EntityFunctions.TruncateTime(i.OrderFinishDate) == EntityFunctions.TruncateTime(dtBillDate) && i.Status == "B") 

Hoạt động như sự quyến rũ.

+0

Không được hỗ trợ trong Khung thực thể. –

+0

Hey @AlexAngas, bạn có thể kiểm tra để xác minh điều này đang hoạt động trong EF4. Phiên bản bạn đang sử dụng? –

+0

Tôi đã sử dụng EF5 và có ngoại lệ này: 'Hệ thống.NotSupportedException: Hàm này chỉ có thể được gọi từ LINQ to Entities. tại System.Data.Objects.EntityFunctions.TruncateTime (Nullable'1 dateValue) '. Có cái gì tôi đang thiếu? –

6

Bạn có thể làm điều đó như dưới đây:

var data1 = context.t_quoted_value.Where(x => x.region_name == "Pakistan" 
         && x.price_date.Value.Year == dt.Year 
         && x.price_date.Value.Month == dt.Month 
         && x.price_date.Value.Day == dt.Day).ToList(); 
-1

Tháo .Date Nếu trường là một DateTime nó có thể được so sánh với ==

var duplicate = from a in _db.AgentProductTraining 
       where a.CourseCode == course.CourseCode && 
       a.DateTaken == course.DateTaken && 
       a.SymNumber == symNumber 
       select a; 
3

bạn phải sử dụng System.Data.Entity.DbFunctions.TruncateTime

Các vấn đề liên quan