2014-01-20 23 views
2

我有一個名爲zeekuser的用戶表,我在其中存儲與用戶相關的時區信息。在檢索我使用下面的代碼,如何使用linq中的TimeZoneInfo.ConvertTimeFromUtc到sql?

var v = (from s in dc.UserWebSites 
          join zk in dc.ZeekUsers on s.aspnet_User.UserId equals zk.UserId 
          where s.aspnet_User.LoweredUserName.Equals(strUsername.ToLower()) 
          select new UserWebSiteInfo 
          { 
           CreateDt = TimeZoneInfo.ConvertTimeFromUtc(s.CreateDt, TimeZoneInfo.FindSystemTimeZoneById(zk.TimeZoneID)), 
           LastUpdateDt = TimeZoneInfo.ConvertTimeFromUtc(s.LastUpdate, TimeZoneInfo.FindSystemTimeZoneById(zk.TimeZoneID)), 
           LogoImage = s.LogoImage, 
           Nickname = s.Nickname, 
           Title1 = s.Title1, 
           Title2 = s.Title2, 
           SiteID = s.SiteID.ToString(), 
           TemplateID = s.TemplateID.ToString(), 
           TemplateName = s.WebSiteTemplate.ThemeName, 
           IsActive = s.IsActive, 
           IsRedirect = s.IsRedirect, 
           RedirectURL = s.RedirectURL, 
           UPID = s.UPID.ToString(), 
           UserId = s.aspnet_User.UserId.ToString(), 
           Username = s.aspnet_User.UserName, 
           UserProductName = s.UserProductDetail.Nickname, 
           PageCount = s.UserWebSitePages.Count(), 
           AuthorName = s.AuthorName, 
           AuthorURL = s.AuthorURL 
          }).OrderByDescending(y => y.LastUpdateDt); 
        info = v.ToList(); 

,但我得到以下錯誤

法 'System.TimeZoneInfo FindSystemTimeZoneById(System.String)' 有沒有支持轉換爲SQL。

每個不同的用戶可以有不同的時區。我該如何解決這個問題?

+1

您需要在客戶端而不是服務器上執行此操作。 – SLaks

+0

該方法沒有SQL方法,因此您無法在調用數據庫的情況下執行此操作,但必須對結果進行轉換。 –

+0

@ AllanS.Hansen時區信息在表格中。那麼,如果有多個記錄被返回,我該如何實現呢? –

回答

2

我懷疑你可以在發送到SQL Server的查詢中這樣做。相反,使用AsEnumerable改背景下進行的.NET側的最後一步:

var query = from s in dc.UserWebSites 
      join zk in dc.ZeekUsers on s.aspnet_User.UserId equals zk.UserId 
      where s.aspnet_User.LoweredUserName.Equals(strUsername.ToLower()) 
      orderby s.LastUpdate descending 
      select new { Site = s, ZoneId = zk.TimeZoneID }; 

// Do the rest of the query in-process, so we can use time zones. 
var results = (from pair in query.AsEnumerable() 
       let site = pair.Site 
       let zone = TimeZoneInfo.FindSystemTimeZoneById(pair.ZoneId) 
       select new UserWebSiteInfo { 
        // Select all your properties here 
       }).ToList(); 

這是假設有沒有在UserWebSites更多的信息比你將使用構建UserWebSiteInfo;如果這是一個無關緊要的信息加載,您應該在您的初始數據庫端查詢中明確選擇相關部分。

+0

感謝您的快速解決方案。由於這會有任何性能問題? –

+0

@PratikGaikwad:它會在.NET中執行轉換,但這不應該太昂貴。 *過濾*仍然會在數據庫中發生。 –

+0

@JonSkeet,Hey Jon,過濾是什麼,我需要按日期過濾,我有時區問題,我猜在這種情況下,當涉及到10萬個實體時,性能會很差。 –