2011-09-23 72 views
1

目前我從我的回購列表中返回所有內容。我期待將這些更改爲IQueryable,以便人們可以優化結果,而不會受到另一個SQL請求(我正在使用nhibernate)。IQueryable <T>問題

我有一個問題,雖然,使生活在每個人更容易我有這樣的事情在我的回購

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

回答

2

目前我從我的回購列表中返回所有內容。我期待 將這些更改爲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) 

或者更好的方式是在實際需要使用這些時間之前將其轉換(在用戶界面或服務中)。

+0

我覺得有一個小姐的理解。當我說「一切」時,我的意思是沒有任何所有收藏都作爲列表返回。它不是我我從數據庫中返回每一條記錄。它只會返回我需要的記錄。我沒有在我給出的例子中使用通用回購。不確定你測試的意思。如果我在哪裏測試它,我會模擬出這個方法,並用Moq來返回結果。您將不得不詳細說明它在實體中的外觀。 – chobo2

+0

我的觀點是你不應該將IQueryable作爲存儲庫方法的返回結果公開。 http://stackoverflow.com/questions/7513681/mocking-out-nhibernate-queryover-with-moq/7518039#7518039 – Dmitry

+0

嗯。 GetAppointmentInStudentTimeZone是一種方法,它是一種回購方法,服務層方法?我原來是這樣做的,所以當你需要時區時你會轉換它,但是這導致了很多ppl沒有轉換它的問題,或者不知道他們有什麼時區。有人認爲最好只是在需要的時區出現(因爲每次計算都需要正確的時區)。如果不是它需要一個參數,我可能會創建另一個屬性,並將其稱爲LocalEndTime,它將調用EndTime Zone並將其轉換爲get方法。 – chobo2