在我的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);
}
答案 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一起使用,则原始问题由列collation属性控制。例如SQL_Latin1_General_CP1_CI_AS
不区分大小写的拉丁文。
如果您拥有DB,则可以在DB级别控制归类序列。
所有这些都很好地解释了...... LINQ to Entities case sensitive comparison
如果首先使用代码,则使用DEFAULT sql server db collation。 有关默认排序规则的更多信息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);
}