2011-09-23 39 views
1

目前我从我的回购列表中返回所有内容。我期待将这些更改为IQueryable,以便人们可以优化结果,而不会受到另一个SQL请求(我正在使用nhibernate)。IQueryable <T>问题

我有一个问题,虽然,使生活在每个人更容易我有这样的事情在我的回购

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

目前我从我的回购列表中返回所有内容。我期待 将这些更改为IQueryable只是让人们可以改进结果和 不受另一个SQL请求(我使用nhibernate)。

您现在有什么问题以及您想如何解决问题几乎没有什么潜在的问题。储存库首先不应返回所有对象。它封装了数据访问并提供了业务驱动的“集合”接口。仓库实现属于数据访问层是足够聪明,不返回的一切:

ordersRepo.FindDelinquent(); 

公共方法返回的IQueryable不是解决方案本身,它只是转移的问题在其他地方,在什么地方它不属于。你将如何测试消耗这个仓库的代码?通用存储库的意义何在,你可能直接使用NHibernate并将所有东西都耦合到它。请看看这两篇文章,这answer

时区转换就可以移动到CalendarAppointment本身:

DateTime end = appointement.EndTimeInStudentTimeZone(Student t) 

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

或者更好的方式是在实际需要使用这些时间之前将其转换(在用户界面或服务中)。

+0

我觉得有一个小姐的理解。当我说“一切”时,我的意思是没有任何所有收藏都作为列表返回。它不是我我从数据库中返回每一条记录。它只会返回我需要的记录。我没有在我给出的例子中使用通用回购。不确定你测试的意思。如果我在哪里测试它,我会模拟出这个方法,并用Moq来返回结果。您将不得不详细说明它在实体中的外观。 – chobo2

+0

我的观点是你不应该将IQueryable作为存储库方法的返回结果公开。 http://stackoverflow.com/questions/7513681/mocking-out-nhibernate-queryover-with-moq/7518039#7518039 – Dmitry

+0

嗯。 GetAppointmentInStudentTimeZone是一种方法,它是一种回购方法,服务层方法?我原来是这样做的,所以当你需要时区时你会转换它,但是这导致了很多ppl没有转换它的问题,或者不知道他们有什么时区。有人认为最好只是在需要的时区出现(因为每次计算都需要正确的时区)。如果不是它需要一个参数,我可能会创建另一个属性,并将其称为LocalEndTime,它将调用EndTime Zone并将其转换为get方法。 – chobo2