Sql server 使用存储过程将数据库表与Kendo Grid(MVC)绑定,并使用适当的服务器端分页、排序和筛选处理大量数据

Sql server 使用存储过程将数据库表与Kendo Grid(MVC)绑定,并使用适当的服务器端分页、排序和筛选处理大量数据,sql-server,asp.net-mvc,kendo-ui,kendo-grid,kendo-asp.net-mvc,Sql Server,Asp.net Mvc,Kendo Ui,Kendo Grid,Kendo Asp.net Mvc,我们有一个包含大量数据(数百万行)的表。我们正在使用一个存储过程来获取记录,并使用mvc方法将该数据与剑道网格绑定。但我们希望只从表中获取所需的行,而不是一次性获取整个数据集,然后在此基础上进行过滤、排序和分页选项 一次只能获取一页行吗?请提供帮助并提出一些建议。首先,您的存储过程中应该有一些分页逻辑。您可以查看此博客文章以获取建议: 然后,在视图中,将网格的数据源设置为在控制器中调用自定义操作。确保启用分页。大概是这样的: .Pageable() .DataSource(dataSource

我们有一个包含大量数据(数百万行)的表。我们正在使用一个存储过程来获取记录,并使用mvc方法将该数据与剑道网格绑定。但我们希望只从表中获取所需的行,而不是一次性获取整个数据集,然后在此基础上进行过滤、排序和分页选项


一次只能获取一页行吗?请提供帮助并提出一些建议。

首先,您的存储过程中应该有一些分页逻辑。您可以查看此博客文章以获取建议:

然后,在视图中,将网格的数据源设置为在控制器中调用自定义操作。确保启用分页。大概是这样的:

.Pageable()
.DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("CustomAjaxBinding_Read", "Grid"))
    )
public ActionResult CustomAjaxBinding_Read([DataSourceRequest] DataSourceRequest request)
        {
            // Get the page number and size, which the grid is requesting
            var pageNumber = request.Page;
            var pageSize = request.PageSize;

            // Call your stored procedure here
            // ...

            // Now return the data to the grid, formatted as JSON
            return Json(result);
        }
最后,在控制器中创建操作,并使其预期为DataSourceRequest参数。该参数将从网格接收一个对象,该对象将包括页面大小和当前页码。您可以使用它们将它们传递给存储过程,并使其仅获取该页数据。它将是这样的:

.Pageable()
.DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("CustomAjaxBinding_Read", "Grid"))
    )
public ActionResult CustomAjaxBinding_Read([DataSourceRequest] DataSourceRequest request)
        {
            // Get the page number and size, which the grid is requesting
            var pageNumber = request.Page;
            var pageSize = request.PageSize;

            // Call your stored procedure here
            // ...

            // Now return the data to the grid, formatted as JSON
            return Json(result);
        }

您可以在Telerik的网站上看到一个ajax数据源示例:查看。

首先,您的存储过程中应该有一些分页逻辑。您可以查看此博客文章以获取建议:

然后,在视图中,将网格的数据源设置为在控制器中调用自定义操作。确保启用分页。大概是这样的:

.Pageable()
.DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("CustomAjaxBinding_Read", "Grid"))
    )
public ActionResult CustomAjaxBinding_Read([DataSourceRequest] DataSourceRequest request)
        {
            // Get the page number and size, which the grid is requesting
            var pageNumber = request.Page;
            var pageSize = request.PageSize;

            // Call your stored procedure here
            // ...

            // Now return the data to the grid, formatted as JSON
            return Json(result);
        }
最后,在控制器中创建操作,并使其预期为DataSourceRequest参数。该参数将从网格接收一个对象,该对象将包括页面大小和当前页码。您可以使用它们将它们传递给存储过程,并使其仅获取该页数据。它将是这样的:

.Pageable()
.DataSource(dataSource => dataSource
        .Ajax()
        .Read(read => read.Action("CustomAjaxBinding_Read", "Grid"))
    )
public ActionResult CustomAjaxBinding_Read([DataSourceRequest] DataSourceRequest request)
        {
            // Get the page number and size, which the grid is requesting
            var pageNumber = request.Page;
            var pageSize = request.PageSize;

            // Call your stored procedure here
            // ...

            // Now return the data to the grid, formatted as JSON
            return Json(result);
        }

您可以在Telerik的网站上看到ajax数据源的一个示例:查看。

我刚才就是这样做的(注意:我使用的是Dapper和EF)

var gridBinder=新的gridBinder(请求);
var filters=gridBinder.GetFilterDescriptor();
var sorting=gridBinder.SortInfo.Member.HasValue()?string.Format(“{0}{1}”,gridBinder.SortInfo.Member,gridBinder.SortInfo.Direction):”;
var p=新的动态参数();
p、 添加(“@Page”,gridBinder.PageNumber,DbType.Int32,ParameterDirection.Input);
p、 添加(“@PageSize”,gridBinder.PageSize,DbType.Int32,ParameterDirection.Input);
p、 添加(“@Filter”,过滤器);
p、 添加(“@SortOrder”,排序);
p、 添加(“@TotalRowCount”,dbType:dbType.Int32,方向:ParameterDirection.Output);
var data=_db.Connection().Query(“dbo.People_GetAll”,p,commandType:System.data.commandType.StoredProcess,事务:_db.Database.CurrentTransaction.GetDbTransaction());
gridBinder.RecordCount=data.FirstOrDefault().TotalRowCount;
返回Json(新数据源结果)
{
总计=gridBinder.RecordCount,
数据=数据
});
活页夹

public class GridBinder
{
    public int PageNumber { get; set; } = 1;

    public int PageSize { get; set; } = 10;

    public int RecordCount { get; set; }

    public SortInfo SortInfo { get; set; } = new SortInfo() { Direction = SortDirection.Asc, Member = string.Empty };

    private readonly DataSourceRequest _command;

    public GridBinder(DataSourceRequest command)
    {
        _command = command;
        PageNumber = command.Page;
        PageSize = command.PageSize;
        GetSortDescriptor();
    }

    private void GetSortDescriptor()
    {
        foreach (SortDescriptor descriptor in _command.Sorts)
        {
            SortInfo.Member = descriptor.Member;
            SortInfo.Direction = descriptor.SortDirection == ListSortDirection.Ascending ? SortDirection.Asc : SortDirection.Desc;
        }
    }

    public string GetFilterDescriptor()
    {
        string filters = string.Empty;
        foreach (IFilterDescriptor filter in _command.Filters)
        {
            filters += ApplyFilter(filter);
        }

        return filters;
    }

    private static string ApplyFilter(IFilterDescriptor filter)
    {
        var filters = "";
        if (filter is CompositeFilterDescriptor)
        {
            filters += "(";
            var compositeFilterDescriptor = (CompositeFilterDescriptor)filter;
            foreach (IFilterDescriptor childFilter in compositeFilterDescriptor.FilterDescriptors)
            {
                filters += ApplyFilter(childFilter);
                filters += " " + compositeFilterDescriptor.LogicalOperator.ToString() + " ";
            }
        }
        else
        {
            string filterDescriptor = "{0} {1} {2}";
            var descriptor = (FilterDescriptor)filter;
            if (descriptor.Operator == FilterOperator.StartsWith)
            {
                filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "LIKE", "'" + descriptor.Value + "%'");
            }
            else if (descriptor.Operator == FilterOperator.EndsWith)
            {
                filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "LIKE", "'%" + descriptor.Value + "'");
            }
            else if (descriptor.Operator == FilterOperator.Contains)
            {
                filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "LIKE", "'%" + descriptor.Value + "%'");
            }
            else if (descriptor.Operator == FilterOperator.DoesNotContain)
            {
                filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "NOT LIKE", "'%" + descriptor.Value + "%'");
            }
            else if (descriptor.Operator == FilterOperator.IsEqualTo)
            {
                filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "=", "'" + descriptor.Value + "'");
            }
            else if (descriptor.Operator == FilterOperator.IsNotEqualTo)
            {
                filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "<>", "'" + descriptor.Value + "'");
            }
            else if (descriptor.Operator == FilterOperator.IsGreaterThan)
            {
                filterDescriptor = string.Format(filterDescriptor, descriptor.Member, ">", "'" + descriptor.Value + "'");
            }
            else if (descriptor.Operator == FilterOperator.IsGreaterThanOrEqualTo)
            {
                filterDescriptor = string.Format(filterDescriptor, descriptor.Member, ">=", "'" + descriptor.Value + "'");
            }
            else if (descriptor.Operator == FilterOperator.IsLessThan)
            {
                filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "<", "'" + descriptor.Value + "'");
            }
            else if (descriptor.Operator == FilterOperator.IsLessThanOrEqualTo)
            {
                filterDescriptor = string.Format(filterDescriptor, descriptor.Member, "<=", "'" + descriptor.Value + "'");
            }

            filters = filterDescriptor;
        }

        filters = filters.EndsWith("And ") == true ? filters.Substring(0, filters.Length - 4) + ")" : filters;
        filters = filters.EndsWith("Or ") == true ? filters.Substring(0, filters.Length - 4) + ")" : filters;

        return filters;
    }
}
public class SortInfo
{
    public string Member { get; set; }
    public SortDirection Direction { get; set; }
}

public enum SortDirection
{
    Asc, Desc
}
公共类GridBinder
{
公共整数页码{get;set;}=1;
公共int PageSize{get;set;}=10;
公共int记录计数{get;set;}
public-SortInfo-SortInfo{get;set;}=new-SortInfo(){Direction=SortDirection.Asc,Member=string.Empty};
私有只读DataSourceRequest\u命令;
公共GridBinder(DataSourceRequest命令)
{
_命令=命令;
PageNumber=命令.Page;
PageSize=command.PageSize;
GetSortDescriptor();
}
私有void GetSortDescriptor()
{
foreach(在_command.Sorts中的SortDescriptor描述符)
{
SortInfo.Member=descriptor.Member;
SortInfo.Direction=descriptor.SortDirection==ListSortDirection.asting?SortDirection.Asc:SortDirection.Desc;
}
}
公共字符串GetFilterDescriptor()
{
字符串过滤器=string.Empty;
foreach(IFilterDescriptor过滤器在_命令.Filters中)
{
过滤器+=应用过滤器(过滤器);
}
回流过滤器;
}
专用静态字符串ApplyFilter(IFilterDescriptor筛选器)
{
var过滤器=”;
如果(筛选器为CompositeFilterDescriptor)
{
过滤器+=“(”;
var compositeFilterDescriptor=(compositeFilterDescriptor)过滤器;
foreach(compositeFilterDescriptor.FilterDescriptors中的IFilterDescriptor子过滤器)
{
过滤器+=应用过滤器(儿童过滤器);
过滤器+=“”+compositeFilterDescriptor.LogicalOperator.ToString()+“”;
}
}
其他的
{
字符串filterDescriptor=“{0}{1}{2}”;
变量描述符=(FilterDescriptor)过滤器;
if(descriptor.Operator==FilterOperator.StartsWith)
{
filterDescriptor=string.Format(filterDescriptor,descriptor.Member,“LIKE”、“'”+descriptor.Value+“%”);
}
else if(descriptor.Operator==FilterOperator.EndsWith)
{
filterDescriptor=string.Format(filterDescriptor,descriptor.Member,“LIKE”、“'%”“%”+descriptor.Value+“”);
}
else if(descriptor.Operator==FilterOperator.Contains)
{
filterDescriptor=string.Format(filterDescriptor,descriptor.Member,“LIKE”、“'%”+descriptor.Value+“%”);
}
else if(descriptor.Operator==FilterOperator.DoesNotContain)
{
filterDescriptor=string.Format(filterDescriptor,descriptor.Member,“不喜欢”、“%”“%”“+”descriptor.Value+“%”);
}
else if(descriptor.Operator==FilterOperator.IsEqualTo)
{
filterDescriptor=string.Format(filterDescriptor,descriptor.Member,“=”、“'+descriptor.Value+”);
}
else if(descriptor.Operator==FilterOperator.IsNotEqualTo)
{