繁体   English   中英

System.Linq.Dynamic.ParseException: '表达式预期'

[英]System.Linq.Dynamic.ParseException: 'expression expected'

我在进行数据表服务器端处理时收到此错误。

当我使用 Ajax 调用此方法时会引发错误。

我认为问题是服务器端编码,我没有得到问题,可能是动态 linq 语法错误。

此语句的动态 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)))
    {
        // This line throws the error
        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>
}

你在这里有几个问题。

一、名单

List<Employee> Employee = _context.Employees.ToList();

真是个坏主意。 它将整个数据库表读入内存,如果它很大,可能会导致内存问题。 但是,更重要的是,之后所做的一切都将在您的 Web 服务器上用 C# 完成,而不是由数据库服务器完成。 ——你正在把数据库服务器从它设计做的事情中剔除。 您希望将其保留为IQueryable<>直到最后,这将是您使用.ToList()的唯一地方。

IQueryable<Employee> Employee = _context.Employees;

接下来,我们有第一个if() ,它大部分都很好,但是你知道searchValue是一个字符串,那你为什么还要不断地尝试将它转换成一个字符串呢? 为什么要一直转换为小写? 再一次,没有ToList()

if (!string.IsNullOrEmpty(searchValue)) //filter
{
    searchValue = searchValue.ToLower();
    Employee = Employee.Where(x => x.Emp_ID.ToString().Contains(searchValue) || 
                                   x.First_Name.ToLower().Contains(searchValue) || 
                                   x.Last_Name.ToLower().Contains(searchValue) || 
                                   x.Gender.ToLower().Contains(searchValue) || 
                                   x.Salary.ToString().Contains(searchValue));
}

现在,我们到了你问的那条线。 基本上,您试图让 LINQ 使用 SQL 语法。 Linq 想要自己的。 但首先,您的if()语句中有一个逻辑错误。 你基本上有if (!(A && B)) 这等于if(!A || !B) 你真正想要的是if(!A && !B)

if (!string.IsNullOrEmpty(sortColumnName) && !string.IsNullOrEmpty(sortDirection))
{

从字符串中获取正确的OrderBy语句是一个棘手的话题,需要反思,在这个问题中有很好的记录: Linq 中的 Dynamic Order By

最后,我们实际运行由ToList()触发的数据服务器的查询。

// Paging
var lstEmployee = Employee
               .Skip(start).Take(length)
               .ToList();

recordsTotal = lstEmployee.Count();

return Json(new { data = lstEmployee }, JsonRequestBehavior.AllowGet);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM