【问题标题】:What I m missing to implement case insensitive search?我缺少什么来实现不区分大小写的搜索?
【发布时间】:2018-08-26 04:57:22
【问题描述】:

这是我的 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);
    }

附:该数据库有 500 万行,所以也请从性能的角度提出建议。

【问题讨论】:

  • 这是一个点网核心应用吗?检查stackoverflow.com/questions/444798/…
  • 不,但是 MVC 5。我认为这只是为了测试,它返回布尔值作为结果。
  • 对不起,我错过了内容的深度。谢谢。
  • 你的数据库是什么?将其配置为不区分大小写的搜索可能是最好的解决方案。
  • Mssql.是的,但我有一些应该完美匹配的搜索选项。我需要了解工作科学,否则我该如何了解更多信息。

标签: javascript asp.net-mvc search datatables


【解决方案1】:

首先,您不应该使用_context.Oils.ToList();,然后您将在过滤之前从数据库中检索所有记录。如果您将ToList() 放在.Take(param.iDisplayLength) 之后,您的所有选择代码将被转换为数据库中的查询,并且只会检索相关记录。由 Linq 扩展执行的 Contains (区分大小写;另请参见 this SO 问题)与我们将由实体框架转换为 LIKE SQL 语句的 Contains 之间存在差异(参见 this SO 问题和 this有关跟踪代码生成的 SQL 语句的视频)。

【讨论】:

  • 如果您将 ToList() 放在.Take(param.iDisplayLength) 之后,您的所有选择代码将被转换为数据库中的查询,并且只会检索相关记录。你会不会详细说明。请。我得到了它的显示长度,但是如何与搜索结合(大写和小写在这里没有问题。)
  • 我需要选择与搜索匹配的数据并仅显示 param.iDisplayLenght 的结果数。如果我首先选择数据数量,那么我的搜索将完全受到影响。
  • 参见this关于Skip and Take in Entity Framework 工作的文章。
  • Entity Framework 将在 ToList() 之前构建所有 C# 查询语句到 1 个 sql 查询。顺序很重要;例如,Skip(10).Take(5) 与 Take(5).Skip(10) 不同。
  • 你睁开了我的眼睛。实际上我只是忘记了线程的概念。但是我应该使用缓存的每个请求仍然需要 1.1 分钟吗?我找不到瓶颈。
【解决方案2】:

正如 Shyju 提到的,参考这篇文章: Case insensitive 'Contains(string)'

这将使您全面了解会发生什么。

以下是该帖子的一小段摘录,供您参考:

测试字符串paragraph是否包含字符串word(感谢@QuarterMeister)

culture.CompareInfo.IndexOf(paragraph, word, CompareOptions.IgnoreCase) &gt;= 0

其中cultureCultureInfo 的实例,描述了编写文本所用的语言。

另外,我鼓励您访问这篇文章,该文章对各种方法的性能进行了详尽的比较,同时检查了字符串中是否出现了字符串。这应该可以帮助您决定采用哪种方法来获得更好的性能。

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

根据您的问题,您可能需要创建一个扩展方法,该方法将根据输入类型使用不同的方法进行预成型检查,以实现最佳性能。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2013-09-26
    • 2023-03-20
    • 1970-01-01
    • 2011-01-02
    • 2013-02-17
    相关资源
    最近更新 更多