Проверка перекрытия дат для нескольких объектов диапазона дат - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть несколько записей в базе данных с начальной и конечной датами

09/15/2011 - 09/30/2011
10/15/2011 - 10/22/2011
11/01/2011 - 11/15/2011

Когда пользователь сохраняет запись, мне нужно убедиться, что даты не перекрываются. Мой простой код проверяет диапазоны дат в конкретной записи (например, пользователь вводит 16.09.2011 или 21.10.2011, я выбрасываю исключение.)

Но при малой вероятности, что пользователь проявит творческий подход (например, 14.10.2011 - 23.10.2011 или даже 14.10.2011 - 16.11.2011), теперь они обошли мой чек.

Кстати, пользователь может ввести с 14.10.2011 по 23.10.2011, если он редактировал запись, содержащую значения 15.10.2011 - 22.10.2011.

Итак, я пытаюсь разгадать эту загадку с помощью запроса linq. Однако то, что у меня есть, работает не совсем правильно.


ОБНОВЛЕНИЕ Не берите в голову, что код не работает. Пытаясь привести пример для расширения отклика Миики, я нашел свой ответ. Итак, отдавая должное 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.

1 Ответ

2 голосов
/ 07 ноября 2011

Вам нужно сделать это в коде, или SQL будет вариантом? Если данные находятся в базе данных, вы можете использовать следующий запрос для проверки совпадений.

SELECT COUNT(*)
FROM Table1
WHERE Table1.StartDate < 'endCheckDate'
    AND Table1.EndDate > 'startCheckDate'

Это вернет счетчик количества найденных совпадений. 'endCheckDate' и 'startCheckDate' - ваши новые значения запроса (в формате даты). Если ваши данные находятся в коллекции объектов в памяти, вы можете использовать LINQ. Если вам нужна помощь с заявлением LINQ, дайте мне знать.

...