2013-04-28 53 views
1

我正在檢查每個事件中DateTime重疊的Events表。我已經編寫了允許用戶輸入Module_code的代碼。將Module_codeEvents表中的條目進行檢查。如果任何事件的Start_Date_TimeEnd_Date_Time與表中任何其他事件的Start_Date_TimeEnd_Date_Time重疊,那麼我只想將該事件行放入數組列表中,然後使用結果填充gridview。我有以下代碼,我認爲這些代碼實現了我的大部分目標。但是,當我運行它時,gridview中沒有數據。調試顯示沒有發送任何內容。我認爲這是一個問題,我想如何將我的值傳遞給arrayList。使用整個數據庫錶行從For循環填充數組列表

'return all relevant tables from the Modules database, based on the module code entered by the user. 
    Dim eventTime = (From mods In db.Modules 
        Join evnt In db.Events On mods.Module_code Equals evnt.Module_code 
        Join rm In db.Rooms On rm.Room_ID Equals evnt.Room_ID 
        Join build In db.Buildings On build.Building_code Equals rm.Building_code 
        Where ((mods.Module_code = initialModCode) And (evnt.Room_ID = rm.Room_ID)) 
        Select evnt.Event_ID, evnt.Module_code, evnt.Event_type, evnt.Start_Date_Time, evnt.End_Date_Time, build.Building_code, rm.Room_Number) 


    Dim listClashes As New ArrayList() 

    For i As Integer = 0 To eventTime.Count - 1 
     For j As Integer = i + 1 To eventTime.Count - 1 
      If (eventTime.ToList(i).Start_Date_Time < eventTime.ToList(j).End_Date_Time) And (eventTime.ToList(i).End_Date_Time > eventTime.ToList(j).Start_Date_Time) Then 
       'MsgBox("Clash", MsgBoxStyle.MsgBoxSetForeground, "") 
       listClashes.Add(eventTime) 
      Else 
       'MsgBox("No Clash", MsgBoxStyle.MsgBoxSetForeground, "") 
      End If 
     Next 
    Next 

    gdvClashes.DataSource = listClashes 
    gdvClashes.DataBind() 

EDIT..Code改爲

If (eventTime(i).Start_Date_Time <= eventTime(j).End_Date_Time) And (eventTime(i).End_Date_Time >= eventTime(j).Start_Date_Time) Then 
       'MsgBox("Clash", MsgBoxStyle.MsgBoxSetForeground, "") 
       listClashes.Add(eventTime.ToList) 
      Else 

此編輯沒有奏效。這是拋出一個例外說,The query operator 'ElementAtOrDefault' is not supported.我在這裏完全錯誤的方向嗎?

編輯..

新代碼的建議

Dim listClashes = From e1 In eventTime 
         From e2 In eventTime 
         Where (e2.Start_Date_Time >= e1.Start_Date_Time) And (e2.Start_Date_Time <= e1.End_Date_Time) 
         Select eventTime 

    gdvClashes.DataSource = listClashes 
    gdvClashes.DataBind() 

如果有這樣的一個封閉的for循環或引用的ArrayList什麼?

+0

hi @GertArnold。是的,問題依然存在。我可能會做與我應該在這裏完全相反的事情。我是一個新手,所以我在盡力而爲地研究MSDN和一些書籍的同時努力工作,並且希望得到方法,但是我無法理解我在這裏要做的事情。很難得到像ArrayList,ToList等的確切功能的簡單答案 – Gavin 2013-04-28 20:10:54

回答

0

您的嵌套循環只是令人困惑。您可以在一個查詢中所做的一切:

Dim listClashes = 
    From e1 in eventTime 
    From e2 in eventTime 
    Where e2.Start_Date > e1.Start_Date && e2.Start_Date < e1.End_Date 
    Select (...) 

那就是:你發現有其他事件的開始日期和結束日期之間的開始日期的事件。

由於eventTimeIQueryable整個聲明listClashes被翻譯成一個SQL查詢,並在最後的數據庫引擎做了所有的努力和您的客戶端代碼只接收的結果。

+0

我很確定我會在這裏被踢出一天,因爲問了很多問題或不理解答案,所以我提前道歉。請看我編輯的問題,看看我現在的代碼。 'Dim listClashes'自然返回所有值。我不能打印出來,因爲VS說'Range變量eventTime隱藏了一個封閉塊中的變量。我知道這是因爲我正在返回潛在的無限結果。我不知道如何讓這是一個可以接受的語句,而不是在執行'select eventTime.first',這自然會破壞目的。 – Gavin 2013-04-28 21:20:17

+0

'選擇e1'或'選擇e2'應該這樣做。 – 2013-04-28 21:26:09

+0

它很近。唯一的問題是,當我返回gridview時,它會返回重疊的結果兩次,並說,例如,「事件11」與「事件12」重疊,如果我選擇返回「e1」,則不會顯示「事件12」我只是展示了一個衝突事件,而不是衝突事件。我相信這是一個更難的查詢。無論如何,你今晚給我足夠的時間(在歐洲),所以我會盡力解決。謝謝@Gert Arnold – Gavin 2013-04-28 22:03:18