2012-03-22 28 views
91
TimeSpan time24 = new TimeSpan(24, 0, 0); 
TimeSpan time18 = new TimeSpan(18, 0, 0);  

// first get today's sleeping hours 
List<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientDateTime - o.ClientDateTimeStamp < time24) && 
      o.ClientDateTimeStamp.TimeOfDay > time18 && 
      clientDateTime.TimeOfDay < time18 && 
      o.UserID == userid).ToList(); 

biểu LINQ này ném ngoại lệ này:luận DbArithmeticExpression phải có một loại phổ biến số

DbArithmeticExpression arguments must have a numeric common type. 

Xin vui lòng giúp!

+0

Kết quả của 'clientDateTime - o.ClientDateTimeStamp' là gì? – shahkalpesh

+0

noramlly phải là một đối tượng của TimeSpan, trong ngoại lệ EF được ném. –

Trả lời

189

Số học với DateTime không được hỗ trợ trong Entity Framework 6 trở về trước. Bạn phải sử dụng DbFunctions *. Vì vậy, đối với phần đầu của tuyên bố của bạn, một cái gì đó như:

var sleeps = context.Sleeps(o => 
    DbFunctions.DiffHours(o.ClientDateTimeStamp, clientDateTime) < 24); 

Lưu ý rằng phương pháp DiffHours chấp nhận Nullable<DateTime>.

Entity Cơ cấu lõi (khi được sử dụng với Sql Server, có lẽ các nhà cung cấp db khác) hỗ trợ các DateTime AddXxx chức năng (như AddHours). Chúng được dịch sang số DATEADD trong SQL.

* EntityFunctions trước khi phiên bản Entity Framework 6.

1

Tôi biết rằng đây là một câu hỏi cũ nhưng trong trường hợp cụ thể của bạn thay vì sử dụng DBFunctions theo đề nghị của @GertArnold, có thể bạn không chỉ cần đảo ngược hoạt động di chuyển số học trong câu hỏi từ Lambda?

Sau khi tất cả clientDateTimetime24 là các giá trị cố định nên sự khác biệt của chúng không cần được tính toán lại trong mỗi lần lặp lại.

Giống như:

TimeSpan time24 = new TimeSpan(24, 0, 0); 
TimeSpan time18 = new TimeSpan(18, 0, 0);  

var clientdtminus24 = clientDateTime - time24; 

// first get today's sleeping hours 
List<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientdtminus24 < o.ClientDateTimeStamp) && 
      o.ClientDateTimeStamp.TimeOfDay > time18 && 
      clientDateTime.TimeOfDay < time18 && 
      o.UserID == userid).ToList(); 

Refactor này thường là có thể nếu bạn đang cố gắng để so sánh datetime lưu chuyển bởi một dấu thời gian sửa chữa với một datetime khác.

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