Linq查询的行为不符合预期

Izz*_*zzy 10 c# linq sql-server entity-framework sql-server-2012

我有一个非常简单的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 
              });
Run Code Online (Sandbox Code Playgroud)

这个问题是出于一些奇怪的原因,它把我搜索的每个人的记录都记录下来,无论是小写还是大写.即

  1. 测试用户
  2. 测试用户
  3. 测试用户

我会找回正确的记录.然而,当我使用小写字母搜索我自己的名字时,我没有得到任何结果,但如果我使用我的名字的第一个字母作为大写,那么我得到结果.我似乎无法弄清楚为什么这样做.

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

我正在使用的searchString是:

  1. richard - 我得到了正确的结果
  2. waidande - 未找到结果

上述两个用户都在数据库中.

我也Entity Framework用来查询Sql Server 2012.

Luk*_*zda 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;
Run Code Online (Sandbox Code Playgroud)

'?'

在这里:'a'!= Cyrillic.一个来自'a' Revenge: The SQL!,第二个是正常的.


想法取自:

在此输入图像描述

幻灯片:http://sqlbits.com/Sessions/Event12/Revenge_The_SQL

PS我强烈建议观看Rob Volk的演讲:NVARCHAR.


iro*_*e13 6

要解决此问题,请确定问题是在EF端还是在DB端.一个常见的错误是额外的空格,所以在继续之前确保不是这种情况.

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

  1. ObjectQuery.ToTraceString()方法
  2. 拦截数据库调用的EF日志记录
  3. Sql server profiler

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

  1. 检查排序规则(请注意,可以在服务器,数据库和单个列级别设置) - 注意区分大小写和正在使用的代码页
  2. 验证您的搜索字符串是否包含可在db代码页中解释的符号 - 例如,如果代码页为252 - Windows Latin 1 ANSI并且您发送的输入包含来自UTF-16的符号超出ANSI范围 - 您将无法获得任何结果,即使符号看起来相同
  3. 非常不可能的,但作为最后检查,如果你的查询中的一个还没有被缓存,描述在这里