C# 如何在MVC中读取DataSourceRequest进行筛选和排序
我在我的asp.NETMVC应用程序中使用了剑道网格MVC,在阅读网格时,我使用了这个模型C# 如何在MVC中读取DataSourceRequest进行筛选和排序,c#,asp.net,asp.net-mvc,asp.net-mvc-4,kendo-grid,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Kendo Grid,我在我的asp.NETMVC应用程序中使用了剑道网格MVC,在阅读网格时,我使用了这个模型 public ActionResult Read([DataSourceRequest] DataSourceRequest request, string sWorkPeriodId, string eWorkPeriodId, string personId) 一般来说,我使用这段代码执行查询并将数据返回到网格 var dataLists = fdata.ToDataSourceResult(req
public ActionResult Read([DataSourceRequest] DataSourceRequest request, string sWorkPeriodId, string eWorkPeriodId, string personId)
一般来说,我使用这段代码执行查询并将数据返回到网格
var dataLists = fdata.ToDataSourceResult(request);
fdata是:
var fdata = _session.Query<WfTask>();
var fdata=\u session.Query();
但在其他类似的情况下,我没有可查询性,我必须从api服务和使用列表中获取数据:
var profile = JsonConvert.DeserializeObject<IEnumerable<PersonDetailInfoViewModel>>(resultApi);
var result=(from t in flowData join personDetailInfoViewModel in profile on t.wfhistory.Actor.Id equals personDetailInfoViewModel.PersonId orderby t.wfhistory.StepNo)
var profile=JsonConvert.DeserializeObject(resultApi);
var result=(从t.wfhistory.Actor.Id上的配置文件中的t将PersonDetailInfo视图模型与t.wfhistory.StepNo上的PersonDetailInfo视图模型连接起来等于PersonDetailInfo视图模型.PersonId orderby t.wfhistory)
所以,第二个有什么问题,第二个如果我在detasource请求中没有网格过滤或排序,我必须检索所有概要文件数据并使用result.ToDataSourceResult(请求);
这使得我的查询速度变慢,因为概要文件上的数据超过18000个,对于每个请求,我都必须获取所有数据,但如果我在请求对象中进行了筛选和排序,我可以读取更少的数据,从而提高查询速度。那么,我可以将DataSourceRequest的数据作为参数发送给api吗?我找到了答案
通过阅读如下请求:
foreach (var item in request.Filters)
{
if (item is Kendo.Mvc.CompositeFilterDescriptor)
{
var result = Gatherfileds((Kendo.Mvc.CompositeFilterDescriptor) item);
foreach (var filterDescriptor in result)
{
listoffilters.Add(filterDescriptor);
}
}
if (item is Kendo.Mvc.FilterDescriptor)
{
var descriptor = (Kendo.Mvc.FilterDescriptor)item;
listoffilters.Add(descriptor);
}
}
Gatherfileds是一种与Foreach完全相同的读取所有项的方法
private List<FilterDescriptor> Gatherfileds(Kendo.Mvc.CompositeFilterDescriptor filteritem)
if (item is Kendo.Mvc.CompositeFilterDescriptor)
{
var result = Gatherfileds((Kendo.Mvc.CompositeFilterDescriptor) item);
foreach (var filterDescriptor in result)
{
listoffilters.Add(filterDescriptor);
}
}
私有列表集合文件(Kendo.Mvc.CompositeFilterDescriptor filteritem)
if(项为Kendo.Mvc.CompositeFilterDescriptor)
{
var result=Gatherfileds((Kendo.Mvc.CompositeFilterDescriptor)项);
foreach(结果中的var filterDescriptor)
{
添加(filterDescriptor)过滤器列表;
}
}
此解决方案运行良好,更清晰、更简洁:
private List<Kendo.Mvc.FilterDescriptor> GetAllFilterDescriptors(DataSourceRequest request)
{
var allFilterDescriptors = new List<Kendo.Mvc.FilterDescriptor>();
RecurseFilterDescriptors(request.Filters, allFilterDescriptors);
return allFilterDescriptors;
}
private void RecurseFilterDescriptors(IList<Kendo.Mvc.IFilterDescriptor> requestFilters, List<Kendo.Mvc.FilterDescriptor> allFilterDescriptors)
{
foreach (var filterDescriptor in requestFilters)
{
if (filterDescriptor is Kendo.Mvc.FilterDescriptor)
{
allFilterDescriptors.Add((Kendo.Mvc.FilterDescriptor)filterDescriptor);
}
else if (filterDescriptor is Kendo.Mvc.CompositeFilterDescriptor)
{
RecurseFilterDescriptors(((Kendo.Mvc.CompositeFilterDescriptor)filterDescriptor).FilterDescriptors, allFilterDescriptors);
}
}
}
私有列表GetAllFilterDescriptors(数据源请求)
{
var allfilterddescriptors=new List();
RecurseFilterDescriptor(request.Filters、AllFilterDescriptor);
返回所有FilterDescriptors;
}
私有void RecurseFilterDescriptor(IList requestFilters,列出所有FilterDescriptor)
{
foreach(requestFilters中的var filterDescriptor)
{
if(filterDescriptor是Kendo.Mvc.filterDescriptor)
{
添加((Kendo.Mvc.FilterDescriptor)FilterDescriptor);
}
else if(filterDescriptor是Kendo.Mvc.CompositeFilterDescriptor)
{
RecurseFilterDescriptor(((Kendo.Mvc.CompositeFilterDescriptor)filterDescriptor)、filterDescriptor、AllFilterDescriptor);
}
}
}
如果您不是在使用剑道过滤器描述器,而是在数据网格上方创建自定义过滤器,该怎么办?类似于Jira的搜索UI的工作方式。