C# sortBy和sortorder仅接收asc或desc的有效性如何?
我想创建一个验证,以便sortBy和sortOrder只接收值在排序器“asc”或“desc”的情况下指定 公共虚拟IPagedList GetAllBooks(字符串名称=null,字符串描述=null,日期时间?createdAt=null,int bookPublisherId=0, int yearPublication=0,int pageIndex=0,int pageSize=int.MaxValue,string sortBy=“”,string sortOrder=“asc”,string searchTerm=“”, bool getOnlyTotalCount=false) { var query=\u bookRepository.Table; 如果(!string.IsNullOrEmpty(名称)) query=query.Where(c=>c.Name==Name); ... 如果(!string.IsNullOrEmpty(searchTerm)) { query=query.Where(c=> c、 Id.ToString()包含(searchTerm)|| c、 Name.Contains(搜索术语) } //添加分析以防止错误/注入 query=query.OrderBy($“{sortBy}{sortOrder}”); var books=新页面列表(查询、页面索引、页面大小、getOnlyTotalCount); 还书; }C# sortBy和sortorder仅接收asc或desc的有效性如何?,c#,sql,C#,Sql,我想创建一个验证,以便sortBy和sortOrder只接收值在排序器“asc”或“desc”的情况下指定 公共虚拟IPagedList GetAllBooks(字符串名称=null,字符串描述=null,日期时间?createdAt=null,int bookPublisherId=0, int yearPublication=0,int pageIndex=0,int pageSize=int.MaxValue,string sortBy=“”,string sortOrder=“asc
这可能需要一些工作,但如果您首先使用强制假条件(即
其中1=0
)执行相同的查询,以确保执行计划不会浪费时间尝试获取数据,则可以使用DbDataReader循环每一列以获取名称
大概是这样的:
DbDataReader reader = cmd.ExecuteReader();
string[] validFieldNames = new string[reader.FieldCount];
for (int i = 0; i < reader.FieldCount; i++)
validFieldNames[i] = reader.GetName(i);
我唯一不确定的是,查询中的别名是否会弄乱这一点。为什么不将它们设为枚举?如果您使用SortOrderEnum.Asc.ToString(“g”)将给出“Asc”作为示例
DbDataReader reader = cmd.ExecuteReader();
string[] validFieldNames = new string[reader.FieldCount];
for (int i = 0; i < reader.FieldCount; i++)
validFieldNames[i] = reader.GetName(i);
if (validFieldNames.Contains(sortField))
// good to go