You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 21:15:35