2011-09-23 8 views
1

현재 내 Repo를 모든 목록으로 반환합니다. 내가 사람들을 결과를 수정하고 다른 SQL 요청 (nhibernate 사용하고 있습니다)로 고생하지 않을 수 있도록 이러한 IQueryable 변경하려면 찾고 있습니다.IQueryable <T> 질문

나는 그래서 다시 현재 결과를 얻을 후 현지 시간으로 시간을 변환 내 REPO

public List<CalendarAppointment> GetAppointment(Student student, DateTime start, DateTime end) 
    { 
     List<CalendarAppointment> appointments = session.Query<CalendarAppointment>().Where(x => x.Student.Id == student.Id 
                   && x.Start.Date >= start.Date && x.End.Date <= end.Date) 
                   .Take(QueryLimits.Appointments).ToList(); 
     return appointments.ConvertToLocalTime(student); 

    } 

    public static List<CalendarAppointment> ConvertToUtcTime(this List<CalendarAppointment> appointments, Student student) 
    { 
     if (student != null) 
     { 
      TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById(student.TimeZoneId); 

      foreach (var appointment in appointments) 
      { 
       appointment.Start = TimeZoneInfo.ConvertTimeToUtc(appointment.Start,info); 
       appointment.End = TimeZoneInfo.ConvertTimeToUtc(appointment.End,info); 
      } 

     } 

     return appointments; 
    } 

에서 이런 일이 모든 사람에 인생을 더 쉽게 만드는하지만 질문이 있습니다. 이렇게하면 걱정할 필요가 없습니다.

IQueryable에서이 작업을 수행하면 어떻게됩니까? 그것은 어쨌든 가서 SQL을 트리거 할 것인가?

답변

2

현재 내 Repo를 모든 목록으로 반환합니다. 나는 을 IQueryable로 변경하여 사람들이 결과를 구체화 할 수 있고 이 다른 SQL 요청 (nhibernate를 사용 중입니다)을 겪지 않도록합니다.

현재 갖고있는 문제와 해결 방법에 대한 잠재적 인 문제점은 거의 없습니다. 저장소는 모든 개체을 처음으로 반환하지 않아야합니다. 데이터 액세스를 캡슐화하고 비즈니스 중심 '콜렉션'인터페이스를 제공합니다. 그냥 다른 곳, 그것이 속하지 않는 곳 어디에 문제를 이동, 공공 방법에서 된 IQueryable 반환

ordersRepo.FindDelinquent(); 

솔루션 자체가되지 않습니다 : 저장소 구현은 모든 반환하지 똑똑 데이터 액세스 계층에 속한다. 이 저장소를 사용하는 코드를 어떻게 테스트 할 것입니까? 제네릭 저장소의 요점은 무엇입니까, 당신은 그냥 NHibernate를 직접 사용할 수도 있고, 모든 것을 거기에 연결할 수도 있습니다.

시간대 변환이 CalendarAppointment 자체로 이동할 수 있습니다 :이 두 기사에서 살펴 본 answer 보시기 바랍니다

DateTime end = appointement.EndTimeInStudentTimeZone(Student t) 

또는

에서
List<CalendarAppointment> appts 
     = GetAppointmentInStudentTimeZone(
           Student student, DateTime start, DateTime end) 

실제로 이러한 시간 (UI 또는 서비스에서)을 사용하기 전에 변환하십시오.

+0

미스가 있다고 생각합니다. "모든 것"이라고 말하면 모든 컬렉션이 목록으로 반환되는 것은 아닙니다. 그것은 내가 데이터베이스에서 모든 단일 레코드를 반환하지 않습니다. 필요한 레코드 만 반환합니다. 내가 준 예제에서 일반적인 저장소를 사용하지 않습니다. 무슨 뜻인지는 모르겠다. 내가 그것을 테스트 할 곳이 있다면 그 방법과 Moq을 조롱하고 그 결과를 다시 돌려 줄 것이다. 엔티티에서 어떻게 보일 지 정교하게해야합니다. – chobo2

+0

요점은 IQueryable을 저장소 메서드의 반환 결과로 노출해서는 안된다는 것입니다. http://stackoverflow.com/questions/7513681/mocking-out-nhibernate-queryover-with-moq/7518039#7518039 – Dmitry

+0

흠. GetAppointmentInStudentTimeZone은 어떤 종류의 메소드인가요? Repo 메소드, 서비스 계층 메소드입니까? 나는 원래 그것을 가지고 있었기 때문에 당신이 시간대를 필요로 할 때 그것을 변환 할 수 있었지만, 이것은 ppl이 그렇게 많은 문제를 일으키거나 변환하지 않았거나 그들이 가지고 있던 시간대를 모른다.모든 시간대에 올바른 시간대가 필요하기 때문에 필요한 시간대처럼 나왔습니다. 그것이 필요하지 않은 경우에 매개 변수가 필요하지 않은 경우 다른 속성을 만들어서 EndTime 영역을 호출하고 get 메서드로 변환하는 LocalEndTime이라고 할 수 있습니다. – chobo2

관련 문제