【问题标题】:populate array list from For loop using entire database table row使用整个数据库表行从 For 循环填充数组列表
【发布时间】:2013-04-28 19:25:40
【问题描述】:

我正在尝试检查我的Events 表以了解每个事件中的日期时间重叠。我编写了允许用户输入Module_code 的代码。此Module_code 将根据Events 表中的条目进行检查。如果任何事件的Start_Date_TimeEnd_Date_Time 与表中任何其他事件的Start_Date_TimeEnd_Date_Time 重叠,仅适用于该模块,那么我想将事件行放入数组列表和稍后用结果填充网格视图。我有以下代码,我认为它可以实现我的大部分目标。但是,当我运行它时,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() 

编辑..代码更改为

 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 或其他东西?

【问题讨论】:

  • 嗨@GertArnold。是的,问题仍然存在。我可能会做与我在这里应该做的完全相反的事情。我是一个新手,所以我在尽我所能研究 MSDN 和几本书的同时,正在研究一种成功和希望的方法,但我无法理解我在这里要做的事情。对于 ArrayList、ToList 等的确切功能等问题,很难得到简化的答案

标签: vb.net linq list gridview arraylist


【解决方案1】:

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

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 查询,最后由数据库引擎完成所有繁重的工作,而您的客户端代码只接收结果。

【讨论】:

  • 我很确定有一天我会因为提出许多问题或不理解答案而被踢到这里,所以我提前道歉。请查看我编辑的问题以查看我当前的代码。 Dim listClashes 自然返回所有值。我无法将这些打印出来,因为 VS 说 Range variable eventTime hides a variable in an enclosing block. I know this is because I am returning potentially infinite results. I don't know how to make this an acceptable statement, short of doing select eventTime.first` 这自然违背了目的。
  • Select e1Select e2 应该这样做。
  • 很接近了。唯一的问题是,当我返回 gridview 时,它将返回重叠结果两次,例如event 11event 12 重叠,如果我选择返回e1,那么event 12 将不会显示,所以我只是显示冲突事件之一,而不是与之冲突的事件。我确信这是一个更困难的查询。不管怎样,今晚(在欧洲)你给了我足够的时间,所以我会努力解决的。谢谢@Gert Arnold
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 2023-01-14
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多