Vb.net 使用整个数据库表行从For循环填充数组列表

Vb.net 使用整个数据库表行从For循环填充数组列表,vb.net,linq,list,gridview,arraylist,Vb.net,Linq,List,Gridview,Arraylist,我正在尝试检查我的事件表,查看每个事件中的日期时间重叠。我已经编写了允许用户输入模块代码的代码。根据事件表中的条目检查此模块代码。如果任何事件的开始日期时间或结束日期时间与表中任何其他事件的开始日期时间或结束日期时间重叠,则仅针对该模块,我希望将事件行放入数组列表中,然后用结果填充gridview。我有以下代码,我认为它实现了我的大部分目标。但是,当我运行gridview时,其中没有数据。调试显示未向其发送任何内容。我想这是我如何将我的值传递给arrayList的问题 'return a

我正在尝试检查我的事件表,查看每个事件中的日期时间重叠。我已经编写了允许用户输入模块代码的代码。根据事件表中的条目检查此模块代码。如果任何事件的开始日期时间或结束日期时间与表中任何其他事件的开始日期时间或结束日期时间重叠,则仅针对该模块,我希望将事件行放入数组列表中,然后用结果填充gridview。我有以下代码,我认为它实现了我的大部分目标。但是,当我运行gridview时,其中没有数据。调试显示未向其发送任何内容。我想这是我如何将我的值传递给arrayList的问题

    '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() 

这应该包含在for循环中还是引用arrayList或其他什么东西中?

您的嵌套循环只会让人困惑。您可以在一个查询中完成所有操作:

Dim listClashes = 
    From e1 in eventTime
    From e2 in eventTime
    Where e2.Start_Date > e1.Start_Date && e2.Start_Date < e1.End_Date
    Select (...)
也就是说:您找到的事件的开始日期介于其他事件的开始日期和结束日期之间


由于eventTime是一个IQueryable,因此整个语句ListCollists被转换为一个SQL查询,最后数据库引擎完成所有的艰苦工作,而您的客户端代码只接收结果。

hi@GertArnold。是的,问题依然存在。我可能在做完全相反的事情。我是一个新手,所以我在研究MSDN和几本书的同时,尽我所能地使用了一种“击中并希望”的方法,但我无法达到我在这里的目的。对于ArrayList、ToList等的确切功能,很难得到简单的答案。我很确定有一天我会因为问了很多问题或不理解答案而被踢到这里,所以我提前道歉。请查看我编辑的问题以查看我当前的代码。Dim ListCollists自然返回所有值。我无法打印这些内容,因为VS表示范围变量eventTime在封闭块中隐藏了一个变量。我知道这是因为我返回了可能无限的结果。我不知道如何让这句话成为一句可以接受的话,除了选择eventTime。首先`这自然会违背目的。选择e1或选择e2就可以了。很接近了。唯一的问题是,当我返回gridview时,它将返回重叠结果两次,例如,事件11与事件12重叠,如果我选择返回e1,则不会显示事件12,因此我只显示一个冲突事件,而不是它与之冲突的事件。我相信这是一个更难的问题。不管怎样,你今晚在欧洲给了我足够的时间,所以我会努力解决的。谢谢你@Gert Arnold
   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()
Dim listClashes = 
    From e1 in eventTime
    From e2 in eventTime
    Where e2.Start_Date > e1.Start_Date && e2.Start_Date < e1.End_Date
    Select (...)