2010-09-29 95 views
2

我們的數據庫中的所有時間都存儲爲UTC,並且我們知道用戶當前的時區,因此想要將其返回。因此,我們要納入一個LINQ投影偏移量爲這樣:Linq2EF:帶時區偏移量的返回日期時間

var users = from u in this.Context.Users 
      select new UserWithCorrectedDate 
      { 
       Id = u.Id, 
       FirstName = u.FirstName, 
       LastName = u.LastName, 
       RegistrationDate = u.RegistrationDate.Value.AddHours(-5) 
      }; 

當然,Linq2EF不能轉換「AddHours」爲規範功能。有沒有另一種方法來做到這一點?

UPDATE:

另一個想法,如果時區偏移被存儲在數據庫中作爲另一列中,會有一個辦法有DB執行計算(日期+偏移)?

+0

查詢的結果集大小是多少?只是在內存中執行它 – Nix 2010-09-29 18:28:14

+0

它是5000個用戶,但只顯示10個,所以我不想使用ToList()。實際上,在此步驟之後,過濾器將應用於查詢,因此不會將其轉換爲對象。 – CodeGrue 2010-09-30 12:00:43

回答

4

LINQ到實體支持SqlFunctions。如果你知道的時間偏移編號,你可以做這樣的事情:

var users = from u in this.Context.Users 
      select new UserWithCorrectedDate 
      { 
       Id = u.Id, 
       FirstName = u.FirstName, 
       LastName = u.LastName, 
       RegistrationDate = SqlFunctions.DateAdd("hour", -5, u.RegistrationDate.Value) 
      }; 

如果你想使用時區功能更精確,你可以做這樣的事情(這是一個有點變通方法) :

public static DateTime UtcToNewYorkTime(DateTime utcDateTime) 
{ 
     TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 

     DateTime converted = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, tzi); 
     return converted; 
} 

然後在你的POCO UserWithCorrectedDate對象,必須爲Timezoned日即獲得唯一的財產。

public class UserWithCorrectDate 
{ 
    public DateTime UTCDate {get;set;} 
    public DateTime NYDate 
    { 
     get 
     { 
      return Utilities.UtcToNewYorkTime(this.UTCDate); 
     } 
    } 
} 
+0

當我嘗試使用第二種方法時,它說:指定類型成員'NYDate'在LINQ to Entities中不受支持。僅支持初始化程序,實體成員和實體導航屬性。 – Samuel 2015-05-28 11:35:19

+0

,因爲它不被linq支持,你需要todo .ToList()之前,但你失去了延遲加載 – CMS 2017-05-14 06:35:09

0

的快速和骯髒的方式做到這一點是要轉換到一個列表,只是LINQ反對把它做:

from u in this.Context.Users.ToList() 
select new { ... }