2012-05-03 24 views
9

DateTime.ToLocalTime không được hỗ trợ trong LINQ to EF.Linq-to-EF DateTime.ToLocalTime không được hỗ trợ

Giải pháp thay thế là gì? Tôi hết ý tưởng.

+0

LINQ to SQL và Entity Framework không giống nhau. Bạn đang sử dụng cái nào? –

+0

Linq2Sql và Linq2EF là hai sản phẩm riêng biệt. Đó là cái nào? – spender

+1

Bạn đang cố gắng sử dụng ToUniversalTime như thế nào - trong mệnh đề where hoặc select? – Phil

Trả lời

-2

Tìm thấy các giải pháp về vấn đề này question

public partial class Person { 

    partial void OnLoaded() { 
    this._BirthDate = DateTime.SpecifyKind(this._BirthDate, DateTimeKind.Utc); 
    } 
} 
+1

Có lỗi này. LINQ to Entities không nhận ra phương thức 'System.DateTime SpecifyKind (System.DateTime, System.DateTimeKind)' và phương thức này không thể được dịch sang biểu thức cửa hàng. – ove

5

Thay vì sử dụng .ToLocalTime() bên trong truy vấn LINQ của bạn, sử dụng chuyển đổi ngược lại bên ngoài của các truy vấn trên các thông số.

var dateUniversal = dateParam.ToUniversalTime(); 

var query = myTable.Where(t => t.DateTime > dateUniversal); 
+0

tính năng này không hoạt động. ToUniversalTime() phải nằm trong truy vấn LINQ vì thời gian là từ mỗi bản ghi cơ sở dữ liệu. – ove

+4

Nếu UTC được lưu trữ trong cơ sở dữ liệu, thì nếu các thông số của bạn là UTC, nó sẽ hoạt động - chắc chắn? – Phil

+0

Đây là câu trả lời đúng cho những gì được hỏi. –

-1

Theo quy tắc, bạn nên lưu trữ ngày và giờ trong UTC trong cơ sở dữ liệu của mình.

Chuyển đổi mọi ngày/giờ địa phương thành UTC trong mã của bạn trước khi bạn lưu trữ chúng trong cơ sở dữ liệu.

Tương tự, nếu bạn cần hiển thị giờ địa phương từ UTC trong cơ sở dữ liệu, sau đó chuyển đổi nó thành mã sau khi tìm nạp cơ sở dữ liệu.

+1

Tôi biết điều này. Tôi cần phải làm một trường hợp đặc biệt và tìm thấy cho dù tôi có thể chạy. ToUniversalTime() hoặc. ToLocalTime() sử dụng linq – ove

+0

Như bạn đã tìm thấy, đây không phải là một ý tưởng tốt. Bạn có thể làm tốt hơn bằng cách sửa "trường hợp đặc biệt" của bạn. HTH. –

+0

@in_visible "Trường hợp đặc biệt" thường được gọi là "wtf" bởi các lập trình viên khác. – Will

0

Tôi đã sử dụng kết hợp Tiện ích mở rộng cộng với dựa trên giá trị được chuyển từ giao diện người dùng của ứng dụng của tôi thành trong LocalTime. Vì vậy, nếu tôi có hai lần ngày .. như .. một ngày bắt đầu và kết thúc tham số ngày cho một báo cáo, tôi muốn đặt chúng lên đó .. cho phép người dùng gửi trong LocalTime .. sau đó trên phần cuối của bộ điều khiển của tôi .. Tôi muốn sử dụng các biến sdate và edate trong LINQ của tôi để truy vấn thực thể. Các phương thức mở rộng tĩnh mà tôi đã ném vào lớp trợ giúp tĩnh. Xin lỗi vì tôi trễ hơn một năm. :)

DateTime sdate = CalcHelper.AbsoluteStart(model.StartDate); 
    DateTime edate = CalcHelper.AbsoluteEnd(model.EndDate); 

    public static DateTime AbsoluteStart(this DateTime dateTime) 
    { 
     return dateTime.Date.ToUniversalTime(); 
    } 
    public static DateTime AbsoluteEnd(this DateTime dateTime) 
    { 
     return AbsoluteStart(dateTime).AddDays(1).AddTicks(-1).ToUniversalTime(); 
    } 
-1

nếu bạn nhận được múi giờ bù đắp từ máy chủ bạn có thể sử dụng EntityFunctions áp dụng bù đắp trong truy vấn LINQ của bạn

var offset = TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes; 
var result = db.Dates.Where(a => 
      EntityFunctions.DiffDays(EntityFunctions.AddMinutes(a.Date, offset), DateTime.Now) == 0); 
-1

Chuyển đổi DateTime để String để so sánh, cho Ví dụ:

const string DATE_FORMAT = "yyyy/MM/dd"; 
var query = sampleTable.Where(x => x.DateTime.ToString(DATE_FORMAT) > DateTime.Now.ToString(DATE_FORMAT)); 
+0

Loại hack so sánh chuỗi này có thể hoạt động với mệnh đề 'Where'; làm thế nào bạn sẽ làm một điều tương tự cho 'GroupBy' mặc dù? –

0

Bạn có thể thử như thế này:

var promotions = _promotionService.GetAll(
      x => (DbFunctions.TruncateTime(x.CreatedDate.Value) >= viewModel.GTXFromDate.Date) 
      && (DbFunctions.TruncateTime(x.CreatedDate.Value) <= viewModel.GTXToDate.Date)); 
Các vấn đề liên quan