我有一个非常简单的linq查询,如下所示:
var result = (from r in employeeRepo.GetAll()
where r.EmployeeName.Contains(searchString)
|| r.SAMAccountName.Contains(searchString)
orderby r.EmployeeName
select new SelectListItem
{
Text = r.EmployeeName,
Value = r.EmployeeName
});
这个问题是出于一些奇怪的原因,它把我搜索的每个人的记录都记录下来,无论是小写还是大写。即
我会找回正确的记录。然而,当我使用小写字母搜索我自己的名字时,我没有得到任何结果,但如果我使用我的名字的第一个字母作为大写,那么我得到结果。我似乎无法弄清楚为什么会这样做。
数据库中的每个名字和姓氏都以大写字母开头。
我使用的searchString是:
richard
- 我得到了正确的结果waidande
- 未找到结果以上两个用户都在数据库中。
我还使用Entity Framework
来查询Sql Server 2012
。
答案 0 :(得分:10)
如果您的文字有NVARCHAR
数据类型,请检查实际上不相同的类似字母:
CREATE TABLE #employee (ID INT IDENTITY(1,1), EmployeeName NVARCHAR(100));
INSERT INTO #employee(EmployeeName) VALUES (N'waidаnde');
SELECT *
FROM #employee
WHERE EmployeeName LIKE '%waidande%';
-- checking
SELECT *
FROM #employee
WHERE CAST(EmployeeName AS VARCHAR(100)) <> EmployeeName;
的 LiveDemo
强>
此处:'а'
!= 'a'
。一个来自Cyrillic
'a'
,第二个是正常的。
理念取自:
幻灯片:http://sqlbits.com/Sessions/Event12/Revenge_The_SQL
P.S。我强烈建议观看 Rob Volk的演讲:Revenge: The SQL!
。
答案 1 :(得分:6)
要解决问题,请确定问题是在EF端还是在DB端。 一个常见的错误是额外的空格,所以在继续之前请确保不是这样。
首先检查EF生成的查询,您可以使用以下方法之一来执行此操作
如果您正确使用EF并且您的查询按预期转换为SQL并且在where部分中包含谓词,但您仍然没有获得任何有意义的结果,那么以下是在DB端尝试的一些想法: / p>
答案 2 :(得分:1)
默认情况下,SQL Server 2012(SQL Server)安装了不区分大小写的排序规则。如果您需要使用区分大小写从数据库中检索记录(因为您有&#34;几个&#34;记录),则需要更改排序规则(请注意,因为如果更改DBMS排序规则,则还要更改主数据库排序规则以及表格和字段名称区分大小写。) 如果您不需要避免从DBMS中检索所有记录,您可以在检索后过滤记录,即
var result = (from r in employeeRepo.GetAll()
where r.EmployeeName.Contains(searchString)
|| r.SAMAccountName.Contains(searchString)
orderby r.EmployeeName
select new SelectListItem
{
Text = r.EmployeeName,
Value = r.EmployeeName
})
.ToList() // Materialize records and apply case sensitive filter
.Where(r.EmployeeName.Contains(searchString)
|| r.SAMAccountName.Contains(searchString));