C# Linq查询的行为不符合预期

C# Linq查询的行为不符合预期,c#,sql-server,entity-framework,linq,sql-server-2012,C#,Sql Server,Entity Framework,Linq,Sql Server 2012,我有一个非常简单的linq查询,如下所示: var result = (from r in employeeRepo.GetAll() where r.EmployeeName.Contains(searchString) || r.SAMAccountName.Contains(searchString) orderby r.EmployeeName select ne

我有一个非常简单的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 
              });
这个问题是出于某种奇怪的原因,它让我找到了我搜索的每个人的记录,不管是小写还是大写。i、 e

测试用户 测试用户 测试用户 我会找回正确的记录。然而,当我用小写字母搜索我自己的名字时,我没有得到任何结果,但是如果我用我名字的第一个字母作为大写字母,那么我会得到结果。我似乎不明白它为什么这么做

数据库中的每个名字和姓氏都以大写字母开头

我正在使用的搜索字符串是:

理查德-我得到了正确的结果 waidande-未找到任何结果 上述两个用户都在数据库中


我还使用实体框架查询Sql Server 2012。

要解决此问题,请确定问题是在EF端还是在DB端。 一个常见的错误是多余的空格,所以在继续之前请确保不是这样

首先检查EF生成的查询,您可以使用以下方法之一执行此操作

如果您正确地使用了EF,并且您的查询按预期转换为SQL,并且在where部分中包含谓词,但仍然没有得到任何有意义的结果,那么以下是一些在DB端尝试的想法:

请检查并注意它可以在服务器、数据库和单个列级别上设置-注意正在使用的区分大小写和代码页 验证您的搜索字符串是否包含可在db代码页中解释的符号-例如,如果代码页为252-Windows Latin 1 ANSI,并且您使用来自UTF-16的超出ANSI的符号发送输入-即使符号看起来相同,您也不会得到任何结果 极不可能,但作为最后手段,请检查您的一个查询是否未被缓存,如前所述
默认情况下,SQL Server 2012 SQL Server是使用不区分大小写的排序规则安装的。如果您需要使用区分大小写从数据库检索记录,因为您有多条记录,您需要更改排序规则,请小心,因为如果更改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));
如果您的文本具有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;
这里:“а”!='a’。一个是西里尔字母“a”,第二个是正常的

想法来自:

幻灯片从:


另外,我强烈推荐观看罗伯·沃尔克的演讲:复仇:SQL

您能否显示searchString的确切数据和值,它似乎进行了不区分大小写的匹配,然后显示了似乎进行了区分大小写的匹配。还有什么是employeeRepo?它是某种类型的Linq to SQL提供程序吗?它是否与SQL Server的区分大小写设置相关?您是否尝试过实际运行SQL查询?这类似于从EmployeeRepo中选择*,其中EnployeeName(如“%richard%”)或SAMAccountName(如“%richard%”),然后复制并粘贴另一个值以查看结果。我怀疑这是一个大小写问题,更有可能是数据库或搜索字符串中有一些特殊字符使其失效。无论是小写还是大写-如果如您所说,GetAll是IEnumerable GetAll,则相当奇怪;,让这成为一个简单的.Net匹配。也许这就是你的情况