2013-03-07 15 views
30

Tôi cố gắng chọn bản ghi trong cơ sở dữ liệu trong 60 ngày 30 ngày 20 ngày differents trong ngày hiện tại.LINQ to Entities không nhận ra phương thức 'System.TimeSpan Subtract (System.DateTime)' phương pháp

Vui lòng xem truy vấn này ở bên dưới.

var uploads = (
       from files in _fileuploadRepository.Table 
       join product in _productRepository.Table on files.Event equals product.Id 
       where 
        (
       product.EventDate != null && 
        (product.EventDate.Subtract(DateTime.Now).Days <= 60 && product.EventDate.Subtract(DateTime.Now).Days >= 60) || 
        (product.EventDate.Subtract(DateTime.Now).Days <= 30 && product.EventDate.Subtract(DateTime.Now).Days >= 30) || 
        (product.EventDate.Subtract(DateTime.Now).Days <= 20 && product.EventDate.Subtract(DateTime.Now).Days >= 20)) 
        && 
       files.IsSkiped == false 
       select files; 
      ).ToList(); 

Nhưng đã xảy ra lỗi khi truy vấn này.

enter image description here

Tôi không biết gì cả. Hãy giúp tôi.

+1

bạn tính toán bên ngoài tuyên bố lambda. Khi nó ở bên trong lambda như bạn đang sử dụng nó, bạn đang cố gắng để EntityFramework làm phép tính khi nó không có nghĩa là để làm như vậy. – Middas

+0

Vì vậy LINQ to SQL sẽ không "dịch" một biểu thức như 'product.EventDate.Subtract (DateTime.Now)'. Trong C#, một ký hiệu thay thế là 'product.EventDate - DateTime.Now', trong đó người ta sử dụng [quá tải của toán tử trừ (' -')] (http://msdn.microsoft.com/en-us/library/1905yhe2. aspx). Có ai biết nếu _that_ sẽ làm việc với LINQ to SQL?Sau khi tất cả, trừ ngày tháng cũng có thể có trong các phương ngữ SQL. –

+0

@JeppeStigNielsen Đối với EF, bạn có thể sử dụng EntityFunctions.DiffDays – scartag

Trả lời

33

Phương pháp đơn giản nhất là làm việc ra các giới hạn trước bạn thực hiện các truy vấn:

// Only evaluate DateTime.Now once for consistency. You might want DateTime.Today instead. 
DateTime now = DateTime.Now; 
DateTime nowPlus60Days = now.AddDays(60); 
DateTime nowPlus30Days = now.AddDays(30); 
DateTime nowPlus20Days = now.AddDays(20); 

var query = ... 
      where product.EventDate <= nowPlus60Days 
      ... 

Lưu ý rằng truy vấn hiện tại của bạn thậm chí không thực sự có ý nghĩa, vì mỗi "hoặc" 'd khoản là nói rằng tính toán đã cho vừa nhỏ hơn hoặc bằng giá trị lớn hơn hoặc bằng cùng một giá trị. Nếu bạn muốn đơn giản "bằng" thì hãy sử dụng nó. Nếu không, không rõ bạn đang làm gì .

Nếu bạn đang cố gắng đưa các giá trị vào "dưới 20", "20-30", "30-60", "trên 60", bạn sẽ cần sử dụng nhóm một số biểu mẫu.

44

Bạn có thể sử dụng phương pháp EntityFunctions.DiffDays

EntityFunctions.DiffDays(product.EventDate, DateTime.Now) //this will return the difference in days 

CẬP NHẬT

EntityFunctions tại là lỗi thời, do đó bạn nên sử dụng DBFunctions để thay thế.

System.Data.Entity.DbFunctions.DiffDays(product.EventDate, DateTime.Now) 
+16

EntityFunctions hiện đã lỗi thời: sử dụng System.Data.Entity.DbFunctions để thay thế. – celerno

2

Để thêm vào câu trả lời của scartag,

Các MSDN documentation for DbFunctions.DiffDays không trực tiếp đề cập đến hay không và khi giá trị trả về bởi DiffDays() sẽ được tiêu cực, vì vậy tôi nghĩ rằng tôi muốn cung cấp thông tin ở đây:

Kết quả sẽ là âm khi đối số 1 ngày lớn hơn (ví dụ trong tương lai tương đối) đối số 2 ngày. Ví dụ, được đưa ra một bảng Deliveries với một trường không rỗng ScheduledDeliveryDate có thể có giá trị cả trong quá khứ và trong tương lai liên quan đến ngày hiện tại, truy vấn này sẽ nhận được tất cả hồ sơ với ngày/giờ giao hàng trong vòng 2 ngày kể từ ngày hiện tại/lần (cả trong quá khứ và tương lai):

DateTime now = DateTime.Now; 
var results = from d in Deliveries 
    where (DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) < 2 
     && DbFunctions.DiffDays(d.ScheduledDeliveryDate, now) > -2) 
    select d; 
3

này nên làm việc:

using System.Data.Entity.SqlServer; 

where (int)SqlFunctions.DateDiff("day", product.EventDate, DateTime.Now) <= 60