如何使用OData构建SharePoint列表的日期范围筛选字符串?
问题根源
- 日期筛选逻辑错误:原代码不管
startDte/compDte是否为空,都会生成完整的条件字符串,导致单个日期筛选时混入空值条件(比如只选完成日期时,会生成StartDate ge '' and CompletionDate le 'xxx',直接导致筛选失效)。 - 筛选调用丢失状态:修改单个日期时,没有传递另一个日期的当前值,导致
buildFilterString无法获取已选的另一个日期,自然无法组合范围筛选。
修复后的代码
1. 修正日期变更函数
const _changeStartDate = (date: Date | null | undefined): void => { setStartDate(date); // 传递当前的完成日期,而非null _RunFilter(null, null, date?.toISOString(), completionDate?.toISOString()); }; const _changeCompletionDate = (date: Date | null | undefined): void => { setCompletionDate(date); // 传递当前的开始日期,而非null _RunFilter(null, null, startDate?.toISOString(), date?.toISOString()); };
2. 重构日期筛选字符串构建逻辑
const buildFilterString = ( id: string, title: string, obu: string, status: string, startDte: string | undefined, compDte: string | undefined ) => { const filters = []; // 单独处理每个日期条件,只添加有值的项 const dateFilters = []; if (startDte) { dateFilters.push(`StartDate ge '${startDte}'`); } if (compDte) { dateFilters.push(`CompletionDate le '${compDte}'`); } // 如果有日期条件,就加入总filters数组 if (dateFilters.length > 0) { filters.push(dateFilters.join(' and ')); } /// More filter strings.... return filters.join(' and '); };
关键改动说明
- 保留筛选状态:修改单个日期时,将另一个日期的当前值传递给
_RunFilter,确保两个日期的筛选状态都能被buildFilterString获取。 - 精准生成条件:通过单独判断每个日期是否有值,只生成有效的筛选条件,避免空值条件混入。当两个日期都有值时,自动用
and组合成范围筛选;只有单个日期时,仅生成对应条件。
内容的提问来源于stack exchange,提问作者NightTom
相关产品推荐
相关产品推荐

