我正在尝试通过 vb.net 中的 linq 重复 2 个日期之间的日期范围
下面是datetimepicker控件中的开始和结束日期信息
startDate = 16-Mar-24
endDate = 22-Mar-24
所以我希望能够重复,如果它超出了数据文件所基于的日期
ID
,[DATE]
,INOUT
喜欢下面想要的结果
Private Sub Form6_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.ReadDatFile()
End Sub
Private Sub ReadDatFile()
OpenFileDialog1.InitialDirectory = "E:\TestFile"
OpenFileDialog1.Filter = "Dat files(*.Dat)|*.Dat"
OpenFileDialog1.RestoreDirectory = True
OpenFileDialog1.ShowDialog()
Me.Activate()
End Sub
Private Sub OnFilter(ByVal sender As Object, ByVal e As EventArgs) Handles btnFilter.Click
Dim datfiles As List(Of DatFile) = New List(Of DatFile)()
Dim lines As String() = File.ReadAllLines(OpenFileDialog1.FileName)
For i As Integer = 0 To lines.Length - 1
If Not String.IsNullOrEmpty(lines(i).Trim()) Then
Dim data As String() = lines(i).Trim().Split(CType(vbTab, Char()))
datfiles.Add(New DatFile With {
.ID = Convert.ToInt32(data(0)),
.DATE = CDate(data(1).ToString().Split(" "c)(0)),
.TIME = data(1).ToString().Split(" "c)(1),
.FP = data(2),
.INOUT = If(data(3).ToString() = "0", "IN", "OUT"),
.OTHERS1 = data(4),
.OTHERS2 = data(5)
})
End If
Next
Dim dtStart As DateTime = Convert.ToDateTime(startDate.Value).Date
Dim dtEnd As DateTime = Convert.ToDateTime(endDate.Value).Date
datfiles = datfiles.Where(Function(x) Convert.ToDateTime(x.DATE) >= dtStart AndAlso Convert.ToDateTime(x.DATE) <= dtEnd).ToList()
DataGridView1.DataSource = datfiles
End Sub
Public Class DatFile
Public Property ID As Integer
Public Property [DATE] As DateTime
Public Property TIME As String
Public Property FP As String
<DisplayName("IN/OUT")>
Public Property INOUT As String
Public Property OTHERS1 As String
Public Property OTHERS2 As String
End Class
数据文件示例
5010 2024-03-17 06:59:10 1 0 0 0
5014 2024-03-17 07:11:00 1 0 0 0
5014 2024-03-17 16:32:09 1 1 0 0
5010 2024-03-17 16:33:19 1 1 0 0
5010 2024-03-18 06:59:10 1 0 0 0
5014 2024-03-18 07:11:00 1 0 0 0
5014 2024-03-18 16:32:09 1 1 0 0
5010 2024-03-18 16:33:19 1 1 0 0
5010 2024-03-19 07:05:15 1 0 0 0
5014 2024-03-19 07:31:19 1 0 0 0
5014 2024-03-19 16:30:50 1 1 0 0
5010 2024-03-19 16:31:12 1 1 0 0
代码结果
身份证 | 日期 | 时间 | FP | 输入输出 | 其他1 | 其他2 |
---|---|---|---|---|---|---|
5010 | 24 年 3 月 17 日 | 06:59:10 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 17 日 | 07:11:00 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 17 日 | 16:32:09 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 17 日 | 16:33:19 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 18 日 | 06:59:10 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 18 日 | 07:11:00 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 18 日 | 16:32:09 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 18 日 | 16:33:19 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 19 日 | 07:05:15 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 19 日 | 07:31:19 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 19 日 | 16:30:50 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 19 日 | 16:31:12 | 1 | 出 | 0 | 0 |
期望的结果
身份证 | 日期 | 时间 | FP | 输入输出 | 其他1 | 其他2 |
---|---|---|---|---|---|---|
5010 | 24 年 3 月 16 日 | 在 | ||||
5014 | 24 年 3 月 16 日 | 在 | ||||
5014 | 24 年 3 月 16 日 | 出 | ||||
5010 | 24 年 3 月 16 日 | 出 | ||||
5010 | 24 年 3 月 17 日 | 06:59:10 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 17 日 | 07:11:00 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 17 日 | 16:32:09 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 17 日 | 16:33:19 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 18 日 | 06:59:10 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 18 日 | 07:11:00 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 18 日 | 16:32:09 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 18 日 | 16:33:19 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 19 日 | 07:05:15 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 19 日 | 07:31:19 | 1 | 在 | 0 | 0 |
5014 | 24 年 3 月 19 日 | 16:30:50 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 19 日 | 16:31:12 | 1 | 出 | 0 | 0 |
5010 | 24 年 3 月 20 日 | 在 | ||||
5014 | 24 年 3 月 20 日 | 在 | ||||
5014 | 24 年 3 月 20 日 | 出 | ||||
5010 | 24 年 3 月 20 日 | 出 | ||||
5010 | 24 年 3 月 21 日 | 在 | ||||
5014 | 24 年 3 月 21 日 | 在 | ||||
5014 | 24 年 3 月 21 日 | 出 | ||||
5010 | 24 年 3 月 21 日 | 出 | ||||
5010 | 24 年 3 月 22 日 | 在 | ||||
5014 | 24 年 3 月 22 日 | 在 | ||||
5014 | 24 年 3 月 22 日 | 出 | ||||
5010 | 24 年 3 月 22 日 | 出 |
这不是一个基于纯 LINQ 的解决方案,但至少它可能会有所帮助。
加载
datfiles
列表后,制作所有ID的列表:
DIM All_IDs AS LIST(of integer) = (
FROM df IN datfiles
GROUP BY the_ID = df.ID
INTO GROUP
SELECT the_ID
).tolist
并列出从
startDate
到 endDate
的所有日期:
DIM All_Dates AS NEW LIST(of date)
DIM day AS date=startDate
WHILE day <= endDate
All_Dates.add(day)
day=day.AddDays(1)
END WHILE
在覆盖每个日期 ID 的所有可能组合的嵌套循环中,检查丢失的记录并根据它在
datfiles
: 中添加一条记录
WITH datfiles
All_Dates.foreach(SUB(the_Date)
All_IDs.foreach(SUB(the_ID)
IF .WHERE(FUNCTION(x) x.DATE=the_Date ANDALSO x.ID=the_ID ANDALSO x.INOUT=0).Count=0 THEN
.add(NEW datfile WITH {.ID=the_ID , .[DATE]=the_Date , .INOUT=0})
END IF
IF .WHERE(FUNCTION(x) x.DATE=the_Date ANDALSO x.ID=the_ID ANDALSO x.INOUT=1).Count=0 THEN
.add(NEW datfile WITH {.ID=the_ID , .[DATE]=the_Date , .INOUT=1})
END IF
End SUB)
End SUB)
END WITH
现在查询结果:
DIM Results =
FROM df IN datfiles
WHERE df.[DATE] >= startDate ANDALSO df.[DATE] <= endDate
SELECT
df.ID,
df.[DATE],
df.TIME,
df.FP,
INOUT = IF(df.INOUT = 0, "IN", "OUT"),
df.OTHERS1,
df.OTHERS2
ORDER BY [DATE],ID,INOUT