基于bit列值动态过滤行:教师日程查询逻辑优化需求
解决TeacherSchedule按Student的NeedsExtraHours过滤的问题
原有的TS.IsAdHoc = @adhocYN过滤逻辑满足不了需求,得换个条件写法:
核心过滤条件调整
直接把WHERE子句改成下面这样,用参数@needsExtraHours(就是你从Student表取到的、空值转0后的数值):
WHERE (@needsExtraHours = 0 OR TS.IsAdHoc = 0)
C#动态SQL代码示例
调整你的C#代码逻辑,不用再设置@adhocYN,直接用处理后的NeedsExtraHours值传参:
// 从Student表获取NeedsExtraHours,空值直接转0 int needsExtraHours = student.NeedsExtraHours ?? 0; // 构建查询SQL string sql = @" SELECT * FROM TeacherSchedule TS WHERE (@needsExtraHours = 0 OR TS.IsAdHoc = 0)"; // 执行查询 using (var cmd = new SqlCommand(sql, yourDbConnection)) { cmd.Parameters.AddWithValue("@needsExtraHours", needsExtraHours); // 后续读取数据的逻辑... }
逻辑解释
- 当
@needsExtraHours是0时,OR左边的条件直接成立,WHERE子句相当于没过滤,会返回所有TeacherSchedule记录,不管IsAdHoc是0还是1 - 当
@needsExtraHours是1时,OR左边不成立,只会保留TS.IsAdHoc = 0的记录,也就是排除AdHoc时段
额外方案:直接在SQL里关联表处理
如果你的场景是针对特定学生查询,也可以不用在C#里先处理NeedsExtraHours,直接在SQL里关联Student表并处理空值:
SELECT TS.* FROM TeacherSchedule TS -- 这里如果是按学生ID查询,换成JOIN加WHERE条件就行 CROSS JOIN Student S WHERE (ISNULL(S.NeedsExtraHours, 0) = 0 OR TS.IsAdHoc = 0)
内容的提问来源于stack exchange,提问作者Codehelp
相关产品推荐
相关产品推荐

