DataTables服务器端处理遇System.Linq.Dynamic.ParseException错误求解
DataTables服务器端处理报错:System.Linq.Dynamic.ParseException: 'expression expected'
在使用DataTables做服务器端处理时,通过Ajax调用后端方法触发了上述错误,经排查问题出在服务端Dynamic LINQ的排序语句语法上,以下是问题代码及修正方案:
服务端C#代码(报错版本)
public ActionResult Indexer() { int start = Convert.ToInt32(Request["start"]); int length = Convert.ToInt32(Request["length"]); string searchValue = Request["search[value]"]; string sortColumnName = Request["columns["+Request["order[0][column]"] + "][name]"]; string sortDirection = Request["order[0][dir]"]; int recordsTotal = 0; List<Employee> Employee = _context.Employees.ToList(); if (!string.IsNullOrEmpty(searchValue)) //filter { Employee = Employee.Where(x => x.Emp_ID.ToString().Contains(searchValue.ToString()) || x.First_Name.ToLower().Contains(searchValue.ToLower()) || x.Last_Name.ToLower().Contains(searchValue.ToLower()) || x.Gender.ToLower().Contains(searchValue.ToLower()) || x.Salary.ToString().Contains(searchValue.ToString())).ToList(); } //sorting if (!(string.IsNullOrEmpty(sortColumnName) && string.IsNullOrEmpty(sortDirection))) { // 此行触发错误 Employee = Employee.OrderBy(sortColumnName + " " + sortDirection).ToList(); } // Paging Employee = Employee .Skip(start).Take(length) .ToList<Employee>(); recordsTotal = Employee.Count(); return Json(new { data = Employee }, JsonRequestBehavior.AllowGet); }
前端脚本
@section scripts { <script src="https://cdn.datatables.net/1.12.1/js/jquery.dataTables.min.js"></script> <script> $(document).ready(function () { $('#mytable').DataTable({ "ajax": { "url": "/Home/Indexer", "type": "POST", "datatype": "josn", }, "columns": [ { "data": "Emp_ID", "name": "Emp_Id" }, { "data": "First_Name", "name": "First_Name" }, { "data": "Last_Name", "name": "Last_Name" }, { "data": "Gender", "name": "Gender" }, { "data": "Salary", "name": "Salary" }, ], "serverSide": "true", "order": [0, "acs"], "processing": "true", }); }) </script> }
问题原因及修正方案
错误原因
Dynamic LINQ的OrderBy方法仅接受列名字符串作为参数,不支持直接拼接列名 + 空格 + 排序方向的格式(比如"Emp_Id asc"),这会导致表达式解析失败,抛出expression expected错误。
修正后的排序代码
将报错的排序逻辑替换为以下代码,根据排序方向选择对应排序方法:
if (!(string.IsNullOrEmpty(sortColumnName) && string.IsNullOrEmpty(sortDirection))) { if (sortDirection.Equals("asc", StringComparison.OrdinalIgnoreCase)) { Employee = Employee.OrderBy(sortColumnName).ToList(); } else { Employee = Employee.OrderByDescending(sortColumnName).ToList(); } }
前端小修正(建议)
前端存在两处笔误,可能影响功能:
"datatype": "josn"改为"datatype": "json""order": [0, "acs"]改为"order": [0, "asc"]
内容的提问来源于stack exchange,提问作者Anurag
相关产品推荐
相关产品推荐

