我在数据库中有几个有开始和结束日期的记录
09/15/2011 - 09/30/2011
10/15/2011 - 10/22/2011
11/01/2011 - 11/15/2011
当用户存储记录时,我需要确保日期不重叠。 我的简单代码检查特定记录中的日期范围(例如,用户输入2011年9月16日或10/21/2011,我抛出异常。)
但是,由于用户很有创意(例如2011年10月14日 - 2011年10月23日或2011年11月16日至2011年11月16日),现在他们已经绕过了我的支票。
顺便说一句,如果用户正在编辑包含值10/15/2011 - 10/22/2011的记录,则用户可以输入10/14/2011至10/23/2011。
所以,我正试图用linq查询解决这个问题。但是,我所拥有的并不完全正确。
更新没关系代码无效。在试图提供一个扩展Miika的回复的例子时,我找到了答案。所以,赞扬Miika指出我正确的方向并在下面发布我的工作代码:
这是我的代码:
Private Sub CheckForOverlap(myMonth As Messages.MyMonth)
Dim am As New MyMonth()
Dim amCollection As Messages.MyMonthCollection
Dim overlappingMyMonthDate As Boolean = False
Dim sErrorMsg As String = ""
'...non-applicable code omitted
Dim query = From s In amCollection _
Let s1 As MyMonth = CType(s, MyMonth) _
Where s1.AttendanceMonthID <> attendanceMonth.AttendanceMonthID And _
(CDate(attendanceMonth.StartDate) < CDate(s1.StartDate) And CDate(attendanceMonth.EndDate) > CDate(s1.EndDate)) _
Select s1
If query.Count > 0 Then
sErrorMsg = "Dates entered surround another entry"
End If
If overlappingMyMonthDate Then
Throw New Exception(sErrorMsg)
End If
End Sub
End Class
这一切都归结为LINQ查询。
答案 0 :(得分:2)
您需要在代码中执行此操作还是SQL可以选择?如果数据位于数据库中,则可以使用以下查询来检查重叠。
SELECT COUNT(*)
FROM Table1
WHERE Table1.StartDate < 'endCheckDate'
AND Table1.EndDate > 'startCheckDate'
这将返回找到的重叠次数的计数。 'endCheckDate'和'startCheckDate'是您的新查询值(以日期格式表示)。如果您的数据位于内存中的对象集合中,那么您可以使用LINQ。如果您需要有关LINQ语句的帮助,请与我们联系。