【问题标题】:How to use TimeZoneInfo.ConvertTimeFromUtc in linq to sql?如何在 linq to sql 中使用 TimeZoneInfo.ConvertTimeFromUtc?
【发布时间】:2014-01-20 14:03:49
【问题描述】:

我有一个名为 zeekuser 的用户表,其中存储了与用户相关的时区信息。在使用下面的代码检索我时,

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 转换。

每个不同的用户可以有不同的时区。我该如何解决这个问题?

【问题讨论】:

  • 您需要在客户端而不是服务器上执行此操作。
  • 该方法没有SQL方法,所以不能在数据库调用中进行,必须对结果进行转换。
  • @AllanS.Hansen 时区信息在表中。那么如果返回多条记录,我该如何实现呢?

标签: c# sql linq datacontext


【解决方案1】:

我怀疑您是否可以在发送到 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 的信息;如果大量不相关的信息,您应该在初始数据库端查询中明确选择相关部分。

【讨论】:

  • 感谢您的快速解决方案。因此会不会出现任何性能问题?
  • @PratikGaikwad:嗯,它将在 .NET 中执行转换,但这不应该太昂贵。 过滤仍将发生在数据库中。
  • @JonSkeet,嘿,乔恩,过滤是什么,我需要按日期过滤,而且我的时区有问题,我猜在这种情况下,当涉及 100 000 个实体时性能会很差?
  • @ValentynVynogradskiy:我认为你应该问一个有更多背景的新问题。 “我对时区有疑问”确实不足以说明情况,任何人都可以帮助您。
猜你喜欢
  • 1970-01-01
  • 2011-01-14
  • 2011-03-09
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多