Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# sortBy和sortorder仅接收asc或desc的有效性如何?_C#_Sql - Fatal编程技术网

C# sortBy和sortorder仅接收asc或desc的有效性如何?

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

我想创建一个验证,以便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); 还书; }
这可能需要一些工作,但如果您首先使用强制假条件(即
其中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