2014-01-20 3 views
2

사용자 관련 표준 시간대 정보를 저장하는 zeekuser라는 사용자 테이블이 있습니다. 코드 아래linq에서 SQL에 TimeZoneInfo.ConvertTimeFromUtc를 사용하는 방법?

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(); 

를 사용하여 I를 검색하지만 오류가 아래

방법 'System.TimeZoneInfo FindSystemTimeZoneById (선택 System.String)를'얻고 동안 SQL에 지원되는 변환이 없습니다.

각기 다른 사용자는 서로 다른 시간대를 가질 수 있습니다. 이 문제를 어떻게 해결할 수 있습니까?

+1

서버가 아닌 클라이언트에서이를 수행해야합니다. – SLaks

+0

메서드에는 SQL 메서드가 없으므로 데이터베이스 호출 내에서 수행 할 수 없지만 결과에 대한 변환을 수행해야합니다. –

+0

@ AllanS.Hansen 표준 시간대 정보가 테이블에 있습니다. 그래서 여러 레코드가 반환되는 경우 어떻게해야합니까? –

답변

2

SQL Server로 보낸 쿼리 내에서 그렇게 할 수 있을지 의심 스럽습니다. 대신, .NET 측의 마지막 단계를 수행하는 컨텍스트를 변경 AsEnumerable를 사용

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(); 

이 당신이 UserWebSiteInfo를 구성하기 위해 사용할 것보다 UserWebSites에서 더 많은 정보가 아니라고 가정한다; 인 정보로드가 부적절한 경우 초기 db 측 쿼리에서 관련 부분을 명시 적으로 선택해야합니다.

+0

빠른 해결책을 가져 주셔서 감사합니다. 이로 인해 성능 문제가 있습니까? –

+0

@PratikGaikwad : .NET에서 변형을 수행 할 예정이지만 너무 비싸지 않아야합니다. * 필터링 *은 여전히 ​​데이터베이스에서 발생합니다. –

+0

@JonSkeet, Hey Jon, 필터링에 대한 설명, 날짜별로 필터링해야하며 시간대 문제가 있습니다.이 경우 100,000 엔티티의 성능이 좋지 않습니까? –

관련 문제