【问题标题】:JQuery Datatables Server Side Processing and FilterJQuery 数据表服务器端处理和过滤器
【发布时间】:2016-09-22 08:22:10
【问题描述】:

我有几个包含大量数据的数据表,因此我使用服务器端处理来提供数据以提高性能。一般来说,这些工作绝对没问题。但是,在尝试过滤表格时会出现问题。它似乎不尊重我的 LINQ 语句中的 where 子句,我不知道为什么。

我的一个数据表初始化示例如下所示:

$('#link-list').dataTable({
        'bServerSide': true,
        'sAjaxSource': '@Url.Action("LazyLoadComms", "Communication")',
        'bProcessing': true,
        async: false,
        'aoColumns': [
            {
                'mDataProp':'Id'
            },
            {
                'mDataProp': 'Customer'
            },
            {
                'mDataProp': 'Receiver'
            },
            {
                'mDataProp': 'PartNo'
            },
            {
                'mDataProp': 'DateOpened'
            }
        ],
        bAutoWidth: false,
        bLengthChange: false,
        pageLength: 10,
        'order': [[4, 'desc']]
    });

而服务端方法如下:

public ActionResult LazyLoadComms(JqueryDataTableParams param)
    {
        var communications = _uow.CommunicationService.Get().ToList();

        IEnumerable<Communication> filteredComms;
        if (!string.IsNullOrEmpty(param.sSearch))
        {
            filteredComms = communications.Where(c => !string.IsNullOrEmpty(c.Customer.Name) ? c.Customer.Name.ToLower().Contains(param.sSearch.ToLower()) : false
                                                    || !string.IsNullOrEmpty(c.Receiver) ? c.Receiver.ToLower().Contains(param.sSearch.ToLower()) : false
                                                    || !string.IsNullOrEmpty(c.PartNo) ? c.PartNo.ToLower().Contains(param.sSearch.ToLower()) : false);
        }
        else
        {
            filteredComms = communications;
        }
        var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]);

        Func<Communication, string> orderingFunction = (c => sortColumnIndex == 0 ? c.CommunicationId.ToString() :
                                                                sortColumnIndex == 1 ? c.Customer.Name :
                                                                sortColumnIndex == 2 ? c.Receiver :
                                                                sortColumnIndex == 3 ? c.PartNo :
                                                                c.DateOpened.ToLongDateString());

        var sortDirection = Request["sSortDir_0"];
        if (sortDirection == "asc")
            filteredComms = filteredComms.OrderBy(orderingFunction);
        else
            filteredComms = filteredComms.OrderByDescending(orderingFunction);

        var displayedComms = filteredComms
                                .Skip(param.iDisplayStart)
                                .Take(param.iDisplayLength)
                                .Select(c => new
                                {
                                    Id = c.CommunicationId,
                                    Customer = c.Customer.Name,
                                    Receiver = c.Receiver,
                                    PartNo = c.PartNo,
                                    DateOpened = c.DateOpened.ToShortDateString() + " " + c.DateOpened.ToShortTimeString()
                                });

        var json = Json(new
        {
            sEcho = param.sEcho,
            iTotalRecords = communications.Count(),
            iTotalDisplayRecords = filteredComms.Count(),
            aaData = displayedComms
        },
                            JsonRequestBehavior.AllowGet);

        return json;
    }

它们似乎不太一致。在这个例子中,它永远不会返回正确的零件编号,并且会打开和关闭是否返回与输入匹配的其他列。

输入始终是一个不带空格的单词,并被转换为小写,因此它应该匹配但不会正确返回。

非常感谢任何帮助。

非常感谢!!!!

【问题讨论】:

    标签: c# jquery linq datatables


    【解决方案1】:

    请替换以下代码。这可能是速度的问题。如果您遇到任何错误,请分享:

    filteredComms = communications.Where(c => (!string.IsNullOrEmpty(c.Customer.Name) && c.Customer.Name.ToLower().Contains(param.sSearch.ToLower()))
        || (!string.IsNullOrEmpty(c.Receiver) && c.Receiver.ToLower().Contains(param.sSearch.ToLower()))
        || (!string.IsNullOrEmpty(c.PartNo) && c.PartNo.ToLower().Contains(param.sSearch.ToLower())));
    

    【讨论】:

    • 但是这段代码是过滤的,过滤是我需要解决的问题。如果我不做任何过滤,它会很好地返回数据,但是当我尝试按列过滤时
    • 我可以删除它,它会将所有记录都返回给我。但这不是重点。关键是当我过滤那段代码中的列时,它没有考虑所有列
    • 您想要包含搜索文本而不考虑列的记录或包含所有列都包含该文本的记录的记录?
    • 谁说删除它? @NikunjRatanpara 说替换它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    相关资源
    最近更新 更多