I have the following ranges in database. I am trying to check if there is an overlapping range on editing existing records.
Range looks like as follows
I used the following code to check overlapping ranges.
var allRanges = await _dlRangesService.GetAllRanges();
var isOverlapping = allRanges.Any(r => r.RangeStart <= rangeToUpdate.RangeStart && rangeToUpdate.RangeStart <= r.RangeEnd && rangeToUpdate.ID != r.ID) ||
allRanges.Any(r => r.RangeStart <= rangeToUpdate.RangeEnd && rangeToUpdate.RangeEnd <= r.RangeEnd && rangeToUpdate.ID != r.ID);
and I added the following condition to through validation on save
if (isOverlapping)
ModelState.AddModelError("Range", "Range overlaps with existing Range.");
but when I edit the first range in pic above 10000 - 10000 to 10000 - 22000 it allows me to save.
I also tried the following, in this case it won't let me save changes even if there is no overlapping range in the database. but it works on creating a new record.
var allRanges = await _dlRangesService.GetAllRanges();
var isOverlapping = allRanges.Any(r => r.RangeStart <= rangeToUpdate.RangeStart && rangeToUpdate.RangeStart <= r.RangeEnd) ||
allRanges.Any(r => r.RangeStart <= rangeToUpdate.RangeEnd && rangeToUpdate.RangeEnd <= r.RangeEnd);
Any help?
CodePudding user response:
Of the following possibilities for overlapping ranges;
1)
[ existing range ]
[ modified range ]
2)
[ existing range ]
[ modified range ]
3)
[ existing range ]
[ modified range ]
4)
[ existing range ]
[ modified range ]
Your test was not handling case 4.
Rather than testing if a range contains the start or end of another range. You need to test that both of these cases are true;
1)
... range 1 ]
[ range 2 ...
2)
[ range 1 ...
... range 2 ]
eg;
r.RangeStart <= rangeToUpdate.RangeEnd
&& r.RangeEnd >= rangeToUpdate.RangeStart

