IQueryable <T>Вопрос - PullRequest
       24

IQueryable <T>Вопрос

1 голос
/ 23 сентября 2011

В настоящее время я возвращаю все из моего репо в виде списка. Я хочу изменить их на 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. В любом случае это сработает?

1 Ответ

2 голосов
/ 24 сентября 2011

В настоящее время я возвращаю все из моего репо в виде списка.Я хочу изменить их на IQueryable, чтобы люди могли уточнить результаты и не страдать от другого SQL-запроса (я использую nhibernate).

Есть несколько потенциальных проблем с тем, что у вас есть сейчас, икак ты хочешь это исправить.Репозиторий не должен возвращать все объекты в первую очередь.Он инкапсулирует доступ к данным и предоставляет бизнес-ориентированный интерфейс для сбора данных.Реализация репозитория относится к уровню доступа к данным, который достаточно умен, чтобы не возвращать все:

ordersRepo.FindDelinquent();

Возврат IQueryable из открытого метода - это не само решение, он просто переносит проблему куда-то в другое место, где он не принадлежит,Как бы вы протестировали код, который использует этот репозиторий?В чем смысл универсального репозитория, вы можете просто использовать NHibernate напрямую и связать все с ним.Пожалуйста, взгляните на эти две статьи, и этот ответ :

Преобразование часового пояса можно перенести в само назначение календаря:

DateTime end = appointement.EndTimeInStudentTimeZone(Student t)

или в

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

или лучшевсе же преобразуйте его, прежде чем вам действительно понадобится использовать это время (в пользовательском интерфейсе или службе).

...