【问题标题】:IQueryable<T> QuestionIQueryable<T> 问题
【发布时间】:2011-11-23 21:27:01
【问题描述】:

目前,我将回购中的所有内容作为列表返回。我希望将这些更改为 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吗?

【问题讨论】:

    标签: nhibernate list iqueryable


    【解决方案1】:

    目前,我将回购中的所有内容作为列表返回。我正在寻找 将这些更改为 IQueryable 以便人们可以改进结果并 不受另一个 sql 请求的影响(我正在使用 nhibernate)。

    您现在拥有的东西以及您希望如何解决它几乎没有潜在的问题。存储库首先不应返回所有对象。它封装了数据访问并提供了业务驱动的'collection like'接口。存储库实现属于足够智能的数据访问层,不会返回所有内容:

    ordersRepo.FindDelinquent();
    

    从公共方法返回 IQueryable 本身并不是解决方案,它只是将问题转移到其他地方,不属于它的地方。您将如何测试使用此存储库的代码?通用存储库有什么意义,您不妨直接使用 NHibernate 并将所有内容耦合到它。请看这两篇文章和这个answer

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

    DateTime end = appointement.EndTimeInStudentTimeZone(Student t)
    

    或在

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

    或者更好的是在您真正需要使用这些时间之前(在 UI 或服务中)进行转换。

    【讨论】:

    • 我觉得理解有误。当我说“一切”时,我的意思是所有集合都作为列表返回。我不是从数据库中返回每一条记录。它只会返回我需要的记录。在我给出的示例中,我没有使用通用存储库。不知道你所说的测试是什么意思。如果我在哪里测试它,我会用 Moq 模拟该方法并返回结果。您必须详细说明它在实体中的外观。
    • 我的观点是,您不应该将 IQueryable 作为存储库方法的返回结果公开。 stackoverflow.com/questions/7513681/…
    • 嗯。 GetAppointmentInStudentTimeZone 是一种什么样的方法,它是一个 repo 方法,服务层方法吗?我最初拥有它,因此您可以在需要时区时对其进行转换,但这导致了许多问题,即 ppl 不转换它或不知道它们所在的时区。决定最好在所需的时区中出现(因为无论如何每个计算都需要正确的时区)。如果不是因为它需要一个参数,我可能会创建另一个属性并将其称为 LocalEndTime ,它将调用 EndTime Zone 并将其转换为它的 get 方法。
    • 有多种方法可以解决与 NHibernate 无关的问题。您可以在答案中使用其中一种解决方案,或者使用值对象,可能使用 Noda Time 作为更具表现力的时间框架等。请随时在网站的 DDD 或 OOP 或与语言无关的部分提出这个特定问题。它确实与 NHibernate 无关。
    • 嗯,我仍然不明白你的第二个解决方案。我不喜欢第一个,因为这意味着每次你都必须调用那个方法,如果你把它们放在一个集合中,你必须遍历它们。我只是看到人们忘记了这样做,我将回到第一方。我不确定您所说的“使用值对象”是什么意思
    猜你喜欢
    • 2020-12-22
    • 2013-09-03
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2010-10-17
    相关资源
    最近更新 更多