ASP.NET中使用Query Builder实现过滤器降序排序的问题
问题原因
你当前把order by DateChanged desc写在IN子句的括号中不符合SQL语法规范,IN子句仅用于定义要匹配的枚举值集合,不允许嵌套排序逻辑,这是你报错的核心原因。
同时你现在定义的FilterByProgress方法的作用是拼接WHERE条件片段,排序逻辑不属于过滤条件范畴,不该放在这个方法内处理。
修复步骤
- 先修改
FilterByProgress方法,移除IN子句中的排序语句,仅保留过滤逻辑:
public static List<string> FilterByProgress(this List<string> whereQueryBuilder, string[] progress) { if (progress.Length > 0) { whereQueryBuilder.Add(string.Format("TA.Progress IN ({0})", string.Join(",", progress.Select(n => "'" + n.ToString() + "'").ToArray()))); } return whereQueryBuilder; }
- 找到你拼接完整SQL语句的代码位置,等所有WHERE过滤条件都拼接完成后,在整个SQL语句的末尾加上排序逻辑即可,示例参考:
// 示例:完整SQL拼接逻辑 List<string> whereConditions = new List<string>(); whereConditions.FilterByProgress(yourProgressArray); // 这里可以继续添加其他过滤条件 // ... // 拼接完整SQL string fullSql = "SELECT 你的查询字段 FROM 你的表名 TA "; if (whereConditions.Count > 0) { fullSql += "WHERE " + string.Join(" AND ", whereConditions); } // 排序逻辑统一加在SQL末尾 fullSql += " ORDER BY DateChanged DESC";
注意事项
当前直接拼接字符串生成SQL的写法存在SQL注入风险,正式项目建议替换为参数化查询,避免直接把用户输入内容拼接到SQL语句中。
内容的提问来源于stack exchange,提问作者pablo191
相关产品推荐
相关产品推荐

