IQueryable <t>问题</t>

时间:2011-09-23 18:15:13

标签: nhibernate list iqueryable

目前我将Repo中的所有内容作为列表返回。我希望将这些更改为IQueryable,以便人们可以优化结果而不会遭受另一个sql请求(我正在使用nhibernate)。

我有一个问题,但是为了让每个人的生活更轻松我在我的回购中有这样的东西

    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吗?

1 个答案:

答案 0 :(得分:2)

  

目前我将Repo中的所有内容作为列表返回。我期待   将这些更改为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)

或者更好的是在实际需要使用这些时间之前转换它(在UI或服务中)。