C# 如何实现与DataTables中的客户端筛选器类似的服务器端筛选器
我正在尝试在我的ASP.NETMVC站点中实现DataTables jQuery插件。我在这里使用了代码的细微变化来实现服务器端处理,它的工作方式与预期的一样。然而,我当时没有意识到服务器端过滤只有在列包含单个单词或精确的单词序列时才会返回搜索,直到尝试了它。这与客户端版本的不同之处在于,全局搜索将对任何列、任何单词、任何顺序进行过滤……真正地过滤结果 例如,表中有两列:ID和Description。如果ID的一个值是“A1B2C3”,而Description的一个值是“在初始化之前捕获事件序列”,如果我在客户端键入“sequence initial”进行搜索,它将返回记录。但是,使用服务器端,如果我键入“SequenceInitial”,则不会返回任何内容。如果我键入“sequence of”,那么将返回记录,这告诉我搜索是由整个搜索词执行的,并查找包含整个短语的记录。这不是我所希望的“过滤”搜索 我对LINQ不太熟悉,所以我不知道我所尝试的是否可行,但下面是返回搜索的FilterResult方法:C# 如何实现与DataTables中的客户端筛选器类似的服务器端筛选器,c#,linq,asp.net-mvc-4,datatables,C#,Linq,Asp.net Mvc 4,Datatables,我正在尝试在我的ASP.NETMVC站点中实现DataTables jQuery插件。我在这里使用了代码的细微变化来实现服务器端处理,它的工作方式与预期的一样。然而,我当时没有意识到服务器端过滤只有在列包含单个单词或精确的单词序列时才会返回搜索,直到尝试了它。这与客户端版本的不同之处在于,全局搜索将对任何列、任何单词、任何顺序进行过滤……真正地过滤结果 例如,表中有两列:ID和Description。如果ID的一个值是“A1B2C3”,而Description的一个值是“在初始化之前捕获事件序列
public IQueryable<IDS> FilterResult(string search, List<IDS> dtResult, List<string> columnFilters)
{
IQueryable<IDS> results = dtResult.AsQueryable();
results = results.Where(p => (search == null || p.ID != null && p.ID.ToLower().Contains(search.ToLower())
|| p.Description != null && p.Description.ToLower().Contains(search.ToLower())));
return results;
}
这对LINQ有可能吗?作为参考,当我尝试将搜索词发送到服务器时,我还尝试通过使用现有查询并添加到其中来更改LINQ查询。该插件将描述中的每个单词拆分为一个列表,并将搜索词拆分为一个列表,然后使用。Any
进行比较:
results = results.Where(p => (search == null || p.ID != null && p.ID.ToLower().Contains(search.ToLower())
|| p.Description != null && (p.Description.ToLower().Contains(search.ToLower()) || p.Description.ToLower().Split(' ').ToList().Any(x => search.ToLower().Split(' ').ToList().Contains(x)))));
这不起作用,因为搜索是专门查找列表中的每个项目。没有筛选器,因此将返回包含搜索列表中任何单词的任何记录
我在网上看到过一些帖子,指出人们通常会进行基于列的搜索,但由于数据表所在页面的不动产有限,我更喜欢使用“一个全局搜索”框
$("#myTable").dataTable({
ajax: {
type: "POST",
url: "datahandler",
contentType: "application/json; charset=utf-8",
data: function (data) { data.currentSearch = oldSearch; return data = JSON.stringify(data); }
},
columns: columnArray,
lengthChange: false,
order: [1, "asc"],
paging: true,
pageLength: 10,
processing: true,
searching: true,
serverSide: true
});
$("#myTable").dataTable().on("preXhr.dt", function (e, settings, data) {
newSearch = $("#dTable").DataTable().search();
data.currentSearch = oldSearch;
});
$("#dTable").dataTable().on("xhr.dt", function () {
oldSearch = newSearch;
});
results = results.Where(p => (search == null || p.ID != null && p.ID.ToLower().Contains(search.ToLower())
|| p.Description != null && (p.Description.ToLower().Contains(search.ToLower()) || p.Description.ToLower().Split(' ').ToList().Any(x => search.ToLower().Split(' ').ToList().Contains(x)))));