目前我将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吗?
答案 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或服务中)。