SPListItem 중 원하는 되풀이 데이터만 가져오기.
금일 작업 중에, 일정 – 되풀이된 일정들을 SPQuery를 이용하여 SPListItemCollection을 가져오는 방법에 대해서
분석했습니다.
문제원인
만일 오늘 날짜에 해당하는 일정(되풀이 포함) 사항을 가져오려면 아래와 같이 작성하게 됩니다.
SPQuery query = new SPQuery();
// 쿼리문생성
query.Query = "<Where>"
+ "<DateRangesOverlap>"
+ "<FieldRef Name=\"EventDate\" />"
+ "<FieldRef Name=\"EndDate\" />"
+ "<FieldRef Name=\"RecurrenceID\" />"
+ "<Value Type=\"DateTime\">"
+ "<Today />"
+ "</Value>"
+ "</DateRangesOverlap>"
+ "</Where>";
SPListItemCollection listItems = list.GetItems(query);
위의 코드대로 작성하게 되면, listItems( SPListItemCollection )의 목록은
오늘 날짜에 해당하는 일정을 가져오는 동시에, 오늘 날짜의 이전 되풀이 일정(한주 기준)들도 함께 나오게 됩니다.
만일 오늘이 목요일이라고 하는 경우, 그 주의 월, 화, 수, 에 있는 되풀이들도 모두 나오게 됩니다.
(되풀이가 아닌 경우에는 정상적으로 나옵니다.)
즉 되풀이에 대한 별도 필터링 작업이 필요해지게 됩니다.
해결 방법
GetItems를 실행하기 전에, 아래와 같이 설정하면 됩니다.
(CalendarDate 부분은 읽어오려는 기준 날짜를 넣어주시면 됩니다.)
query.CalendarDate = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day);
query.RecurrenceOrderBy = true;
query.ExpandRecurrence = true;
위와 같이 넣고, GetItems를 하시면 정확히 원하는 되풀이만 가져올 수 있습니다.