![](/img/trans.png)
[英]System.Linq.Dynamic.ParseException: '.' or '(' expected - VS2012 ERROR
[英]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.