2013-05-24 55 views
7

Tôi có một cơ sở dữ liệu PostgreSQL tương tác với chương trình thông qua Mã khung thực thể đầu tiên.Sử dụng DateTime trong LINQ to Entities

Cơ sở dữ liệu chứa bảng "người dùng" có loại "Thời gian truy cập" cột của DateTime.

Ứng dụng được mô tả là;

public class Users 
{ ... 
    [Required] 
    [Column("visit")] 
    public DateTime VisitDate 
    ... 
} 

Tôi đang cố chạy truy vấn này;

var rslt = context.Visitors.Where(v => v.VisitDate.Date == DateTime.Now.Date).ToList() 

Nhưng nhận được một ngoại lệ: NotSupportedException

Có chuyện gì vậy?

+0

bạn có thể đăng chi tiết bên trong của ngoại lệ của mình không? –

+0

bạn có thể sử dụng 'var rslt = context.Visitors.Where (v => v.VisitDate.Date == DateTime.Now) .ToList()' – Saravanan

+0

@saravanan Tôi nghĩ bạn có thể có nghĩa là 'Datetime.Today' thay vì' DateTime .Now'? –

Trả lời

10

DateTime.Date thuộc tính không được hỗ trợ. Thay vào đó, bạn phải sử dụng phương thức SqlFunctions.DatePart. Nó sẽ kết thúc với phương thức DATEPARTTSQL trong truy vấn SQL được tạo.

var rslt = context.Visitors 
        .Where(v => SqlFunctions.DatePart("year", v.VisitDate) == SqlFunctions.DatePart("year", DateTime.Now)) 
        .Where(v => SqlFunctions.DatePart("dayofyear", v.VisitDate) == SqlFunctions.DatePart("dayofyear", DateTime.Now)) 
        .ToList(); 
+2

Cảm ơn bạn đã trả lời, nhưng tôi lại nhận được NotSupportedException. Nhưng thông báo chứa thông tin khác: Phương thức được chỉ định 'System.Nullable'1 [System.Int32] DatePart (System.String, System.Nullable'1 [System.DateTime]) "trên loại" System.Data.Objects.SqlClient. SqlFunctions "không thể được dịch thành biểu thức lưu trữ LINQ to Entities. Có lẽ đó là vấn đề của PostgreSQL? – pma11

3

Vấn đề là nhà cung cấp LINQ đang cố gắng chuyển đổi DateTime.Now.Date thành phương thức cơ sở dữ liệu mà phương thức này không thể thực hiện theo mặc định. Bí quyết để so sánh ngày tháng là tạo một cá thể DateTime có thành phần thời gian được đặt thành giá trị mặc định. Bạn có thể tìm thêm thông tin herehere.

1

Mayur Borad của câu trả lời (IMHO hơn đúng hơn là câu trả lời được chấp nhận) đã trở thành quá hạn:

System.Data.Entity.Core.Objects.EntityFunctions là lỗi thời. Bạn nên sử dụng System.Data.Entity.DbFunctions để thay thế.

var today = DateTime.Today; // (Time already removed) 

var bla = context.Contacts 
    .FirstOrDefault(x => DbFunctions.TruncateTime(x.ModifiedDate) == today); 
Các vấn đề liên quan