.net如何使搜索方法不区分大小写?

时间:2014-06-17 21:05:20

标签: entity-framework asp.net-mvc-5 repository-pattern

在我的MVC Web应用程序中,我正在创建一个搜索功能,我需要将搜索字符串与产品存储库中的对象进行比较 - 但是如何确保搜索不区分大小写? 我可以在我的搜索字符串上使用ToLower() - 但是存储库?

控制器:

 public ActionResult Search(string q, int page = 1)
 {
        string search = q.ToLower();
        int productCounter = repository.Products.Where(p => p.Name.Contains(search) || p.Description.Contains(search)).Count();

            ProductsListViewModel model = new ProductsListViewModel
            {
                Products = repository.Products
                .Where(p => p.Name.Contains(search) || p.Description.Contains(search))
                .OrderBy(p => p.ProductID)
                .Skip((page - 1) * PageSize)
                .Take(PageSize),
                PagingInfo = new PagingInfo
                {
                    CurrentPage = page,
                    ItemsPerPage = PageSize,
                    TotalItems = productCounter == 0 ? 0 : productCounter
                }
            };
        return View("List", model);
    }

3 个答案:

答案 0 :(得分:3)

你可以替换它:

p.Name.Contains(search)

用这个:

p.Name.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0

答案 1 :(得分:3)

您可以使用IndexOf访问IgnoreCase中的In memory collections。 将此应用于EF提供程序方案时,您可能会感到失望。 这是否正确标记了EF?

EF Provider规范不使用IndexOf。 就此而言,也不支持Contains(str,comparer)。

Supported Linq to Entities features

如果将SQLServer与EF一起使用,则原始问题由列collat​​ion属性控制。例如SQL_Latin1_General_CP1_CI_AS不区分大小写的拉丁文。

如果您拥有DB,则可以在DB级别控制归类序列。

所有这些都很好地解释了...... LINQ to Entities case sensitive comparison

如果首先使用代码,则使用DEFAULT sql server db collat​​ion。 有关默认排序规则的更多信息Set database collation in Entity Framework Code-First Initializer

答案 2 :(得分:-1)

您可以使用Invariant Culture并使用Length来增强查询:

 public ActionResult Search(string q, int page = 1)
    {
        string s;
        string search = q.ToUpperInvariant();
        int productCounter = repository.Products.Where(p => p.Name.ToUpperInvariant().Contains(search) || p.Description.ToUpperInvariant().Contains(search)).Count();
        int searchlength = search.Length;
        ProductsListViewModel model = new ProductsListViewModel
        {
            Products = repository.Products
            .Where(p => (p.Name.Length >= searchlength && p.Name.ToUpperInvariant().Contains(search)) || (p.Description.Length >= searchlength && p.Description.ToUpperInvariant().Contains(search)))
            .OrderBy(p => p.ProductID)
            .Skip((page - 1) * PageSize)
            .Take(PageSize),
            PagingInfo = new PagingInfo
            {
                CurrentPage = page,
                ItemsPerPage = PageSize,
                TotalItems = productCounter == 0 ? 0 : productCounter
            }
        };
        return View("List", model);
    }