2011-08-16 22 views
47

Tôi cố gắng để thực hiện đoạn mã sau và đang nhận được một lỗi'Ngày' không được hỗ trợ trong LINQ to Entities. Chỉ initializers, các thành viên tổ chức nào, và tài sản thực thể chuyển hướng được hỗ trợ

public List<Log> GetLoggingData(DateTime LogDate, string title) 
{ 
    var context = new LoggingEntities(); 
    var query = from t in context.Logs 

      where t.Title == title 
      && t.Timestamp == LogDate 

      select t; 
    return query.ToList(); 
} 

Các lỗi Tôi nhận được "Các loại quy định thành viên 'ngày' là không được hỗ trợ trong LINQ to Entities. Chỉ hỗ trợ các trình khởi tạo, các thành phần thực thể và các thực thể điều hướng thực thể. " Tôi đã thử những nỗ lực khác nhau để đúc mọi thứ cho một chuỗi, chỉ so sánh phần ngày, nhưng dường như không thể có được sự kết hợp đúng đắn. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

+1

Hiện chúng tôi lớp Logs và bảng nó được ánh xạ tới. – BennyM

+0

Tôi đang sử dụng EFv1 với .net 3.5. Lớp nhật ký chỉ là bảng nhật ký từ thư viện doanh nghiệp với tiêu đề dưới dạng loại Chuỗi và Dấu thời gian làm trường ngày giờ.Tôi chỉ muốn so sánh ngày tháng – mikemurf22

Trả lời

23

Không phải là giải pháp tốt nhất, nhưng nó hoạt động. Vì nhiều lý do, tôi phải sử dụng .net 3.5 vào thời điểm này và việc sửa đổi cơ sở dữ liệu sẽ rất khó khăn. Dù sao, đây là một giải pháp hoạt động:

  var query = from t in context.Logs 
         where t.Title == title 
         && t.Timestamp.Day == LogDate.Day 
         && t.Timestamp.Month == LogDate.Month 
         && t.Timestamp.Year == LogDate.Year 
         select t; 

Không phải là giải pháp thanh lịch nhất, nhưng nó có hiệu quả.

+0

Thành viên loại được chỉ định 'Ngày' không được hỗ trợ trong LINQ to Entities. Chỉ 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ể mới được hỗ trợ. – SAR

1

Đúng nếu tôi sai, nhưng trong ví dụ của mikemurf22, nó cần kiểm tra từng phần của thành phần ngày và có khả năng xử lý nhiều máy chủ hơn?

Dù sao, tôi tình cờ gặp vấn đề này và đây là giải pháp của tôi.

Giả sử rằng bạn sẽ chỉ chuyển qua thành phần ngày, bạn có thể tìm thấy phút cuối cùng của ngày mà bạn chuyển vào và sử dụng mệnh đề where để xác định phạm vi.

public List<Log> GetLoggingData(DateTime LogDate, string title) 
{ 
    DateTime enddate = new DateTime(LogDate.Year, LogDate.Month, LogDate.Day, 23, 59, 59) 

    var query = from t in context.Logs 
       where t.Timestamp >= date 
       where t.Timestamp <= enddate 
       select t; 

    return query.ToList(); 
} 
-1

Bạn có thể sử dụng hack này:

DateTime startDate = LogDate.Date; 
DateTime endDate = LogDate.Date.AddDays(1); 

var query = from t in context.Logs 
      where t.Title == title 
        && t.Timestamp >= startDate 
        && t.Timestamp < endDate 
      select t; 
+0

Tôi đã sửa lại một chút. Của cource bạn không thể sử dụng phương thức AddDays bên trong truy vấn của bạn. Nhưng bạn có thể di chuyển nó ra ngoài. Vì vậy, workaround vẫn hoạt động. – algreat

83

Nếu bạn đang sử dụng EF 6.0+, bạn có thể sử dụng DbFunctions.TruncateTime(DateTime?):

var query = 
    from t in context.Logs 
    where t.Title == title 
    && DbFunctions.TruncateTime(t.Timestamp) == LogDate.Date 
    select t; 

Lưu ý: Đối với phiên bản trước đó của EF nơi DbFunctions không khả dụng, thay vào đó, EntityFunctions.TruncateTime(DateTime?) có thể được sử dụng.

+0

Bạn cũng sẽ phải cắt bớt thuộc tính LogDate.Date – invalidusername

+1

@invalidusername LogDate là một DateTime có nghĩa là LogDate.Date bị "cắt ngắn" –

+3

+1 cho bạn. Tôi không thể sử dụng câu trả lời được chấp nhận trong trường hợp của tôi như tôi đã làm một so sánh 'lớn hơn', trong đó bạn không thể so sánh ngày, tháng và năm riêng biệt. –

2

Luôn sử dụng EntityFunctions.TruncateTime() cho cả x.DateTimeStart và LogDate. như:

var query = from t in context.Logs 
       where t.Title == title 
       && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate) 
       select t; 
0

Chuyển đổi LongDate để .ToShortDateString và sau đó bạn có thể sử dụng nó theo cách này:

EntityFunctions.TruncateTime(t.Timestamp) == LogDate 

như mike đã

0

Hãy thử điều này:

var calDate = DateTime.Now.Date.AddDays(-90); 

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate) 
Các vấn đề liên quan