Nhibernate IQueryable<;T>;问题:

Nhibernate IQueryable<;T>;问题:,nhibernate,list,iqueryable,Nhibernate,List,Iqueryable,目前,我将回购协议中的所有内容作为列表返回。我希望将这些更改为IQueryable,这样人们就可以优化结果,而不必忍受另一个sql请求(我使用的是nhibernate) 我有一个问题想让每个人的生活更轻松我的回购协议中有这样的东西 public List<CalendarAppointment> GetAppointment(Student student, DateTime start, DateTime end) { List<Calenda

目前,我将回购协议中的所有内容作为列表返回。我希望将这些更改为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;
    }
public List GetAppointment(学生、日期时间开始、日期时间结束)
{
列出约会=session.Query()。其中(x=>x.Student.Id==Student.Id
&&x.Start.Date>=开始.Date&&x.End.Date
目前,我将回购协议中的所有内容作为列表返回。我希望
将这些更改为IQueryable,以便人们可以细化结果并
不受另一个sql请求的影响(我使用的是nhibernate)

您现在所拥有的以及您希望如何解决它的潜在问题很少。存储库首先不应返回所有对象。它封装了数据访问,并提供了业务驱动的“类收集”接口。存储库实现属于数据访问层,它足够聪明,不会返回ev任何事情:

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

时区转换可以移动到日历约会本身:

DateTime end = appointement.EndTimeInStudentTimeZone(Student t)
或者

列表应用程序
=GetAppointInstudentTimeZone(
学生,日期时间开始,日期时间结束)

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

我认为这是一个误解。当我说“一切”时我的意思是什么?所有集合都以列表的形式返回。我不会返回数据库中的每一条记录。它只返回我需要的记录。在我给出的示例中,我没有使用通用的repo。不确定测试是什么意思。如果我在何处测试它,我会模拟该方法并使用Moq,然后返回结果。你会的必须详细说明它在实体中的外观。我的观点是,您不应该将IQueryable公开为repository方法的返回结果。嗯。GetAppointInstudentTimeZone是什么类型的方法?它是一种repo方法,服务层方法吗?我最初有它,所以您需要时区时可以转换它,但这导致了ppl没有转换它或不知道它在哪个时区的任何问题。决定最好是按照所需的时区进行计算(因为每次计算都需要正确的时区)。如果不是因为它需要一个参数,我可能已经创建了另一个属性并将其称为LocalEndTime,该属性将调用EndTime Zone并在其get方法中对其进行转换。有多种方法可以解决与NHibernate无关的问题。您可以在答案中使用其中一种解决方案,也可以使用值对象,可能使用Noda Time作为更具表现力的时间框架等。请在DDD或OOP或网站的语言不可知部分自由提问这个具体问题。它与NHibernate真的没有任何关系。我仍然不理解你的第二个解决方案。我不喜欢第一个,因为它意味着每次你也必须调用该方法,如果你在一个集合中,你必须循环使用它们。我只是看到ppl忘记了这样做,我将回到原点。我不确定你所说的“使用值对象”是什么意思
List<CalendarAppointment> appts 
         = GetAppointmentInStudentTimeZone(
                                Student student, DateTime start, DateTime end)