Чего мне не хватает для реализации поиска без учета регистра? - PullRequest
0 голосов
/ 26 августа 2018

Вот мой файл js. Я сделал все на стороне сервера. И реализованы все основные и некоторые дополнительные функции плагинов Datatable. Но функция поиска чувствительна к регистру. Если я ищу «масло», оно показывает только масло, но не масло.

$(document).ready(function () {
var oTable = $('#myDataTable').dataTable({
    "bServerSide": true,
    "sPaginationType": "full_numbers",
    "sAjaxSource": "/DB/AjaxOil",
    "bProcessing": true,
    "Search": {
        "caseInsensitive": true
              },
    "aoColumns": [
        {
            "sName": "OilId",
            "aTargets": [0],    //Edit column
            "mData": "OilId",
            "bSearchable": false,
            "bSortable": false,
            "mRender": function (data, type, full) {
                var id = full[0]; //row id in the first column
                return "<a>"+id+"</a>";
            }
        },
        { "sName": "CommonName" },
        { "sName": "BotanicalName" },
        { "sName": "PlantParts" },
        { "sName": "Distillation" }
    ],
    "columnDefs": [
        {
            "targets": [0],
            className: "hide_column",
            "searchable": false
        }
    ]

});

});

А вот и моя функция ajax

          public ActionResult AjaxOil(JQueryDataTableParamModel param)
    {
        IEnumerable<Oil> allOils = _context.Oils.ToList();
        IEnumerable<Oil> filteredOils;
        if (!string.IsNullOrEmpty(param.sSearch))
        {
            filteredOils = allOils
                     .Where(c => c.CommonName.Contains(param.sSearch)
                                 ||
                                 c.BotanicalName.Contains(param.sSearch)
                                 ||
                                 c.PlantParts.Contains(param.sSearch)
                                 ||
                                 c.Distillation.Contains(param.sSearch));
        }
        else
        {
            filteredOils = allOils;
        }

        var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]);
        Func<Oil, string> orderingFunction = (c => sortColumnIndex == 1 ? c.CommonName :
                                                            sortColumnIndex == 2 ? c.BotanicalName :
                                                            c.PlantParts);


        var distillationFilter = Convert.ToString(Request["sSearch_4"]);
        var commonFilter = Convert.ToString(Request["sSearch_1"]);
        var botanicalFilter = Convert.ToString(Request["sSearch_2"]);
        var plantFilter = Convert.ToString(Request["sSearch_3"]);


        if (!string.IsNullOrEmpty(commonFilter))
        {
            filteredOils = filteredOils.Where(c => c.CommonName.Contains(commonFilter));

        }

        if (!string.IsNullOrEmpty(botanicalFilter))
        {
            filteredOils = filteredOils.Where(c => c.BotanicalName.Contains(botanicalFilter));

        }

        if (!string.IsNullOrEmpty(plantFilter))
        {
            filteredOils = filteredOils.Where(c => c.PlantParts.Contains(plantFilter));

        }

        if (!string.IsNullOrEmpty(distillationFilter))
        {
            filteredOils = filteredOils.Where(c => c.Distillation.Contains(distillationFilter));

        }


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

        var displayedOils = filteredOils
                           .Skip(param.iDisplayStart)
                           .Take(param.iDisplayLength);
        var result = from c in displayedOils
                     select new[] { Convert.ToString(c.OilId), c.CommonName, c.BotanicalName, c.PlantParts, c.Distillation };
        return Json(new
        {
            sEcho = param.sEcho,
            iTotalRecords = allOils.Count(),
            iTotalDisplayRecords = filteredOils.Count(),
            aaData = result
        },
                         JsonRequestBehavior.AllowGet);
    }

P.s. База данных насчитывает 5 миллионов строк, поэтому, пожалуйста, предложите и с точки зрения производительности.

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Как уже упоминал Шиджу, см. Этот пост: Без учета регистра 'Содержит (строка)'

Это даст вам целостное представление о том, чего ожидать.

Вот небольшая выдержка из сообщения для вашей справки:

Чтобы проверить, содержит ли строка paragraph строку word (спасибо @QuarterMeister)

culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) >= 0

Где culture - это экземпляр CultureInfo, описывающий язык, на котором написан текст.

Кроме того, , я рекомендую вам посетить эту статью, в которой содержится исчерпывающее сравнение производительности различных методов при проверке, встречается ли строка внутри строки.Это должно помочь вам решить, какой подход выбрать для повышения производительности.

http://cc.davelozinski.com/c-sharp/fastest-way-to-check-if-a-string-occurs-within-a-string

Исходя из вашего вопроса, вам, возможно, придется создать метод расширения, который будет использовать другой подход к проверке преформ на основе типа ввода для достижения наилучшей производительности.

Надеюсь, это поможет!

0 голосов
/ 26 августа 2018

Прежде всего, вы не должны использовать _context.Oils.ToList();, затем вы получите все свои записи из базы данных перед их фильтрацией.Если вы поставите ToList() после .Take(param.iDisplayLength), весь ваш код выбора будет преобразован в запрос в вашей базе данных, и будут получены только соответствующие записи.Существует различие между объектами Contains, выполняемыми расширением Linq (регистр символов; см. Также этот вопрос SO), и элементами Contains, которые будут преобразованы средой Entity Framework в оператор SQL LIKE (см. this ТАК вопрос и это видео о трассировке операторов SQL, сгенерированных вашим кодом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...