c# - Linq 查询未按预期运行

标签 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 new SelectListItem 
              { 
                  Text = r.EmployeeName, 
                  Value = r.EmployeeName 
              });

这个问题是出于某种奇怪的原因,它为我获取了我搜索的每个人的记录,无论是小写还是大写。即

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

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

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

我使用的 searchString 是:

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

以上两个用户都在数据库中。

我还使用 Entity Framework 查询 Sql Server 2012

最佳答案

如果您的文本具有 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;

db<>fiddle demo

此处:'а' != 'a'。一个来自 Cyrillic 'a',第二个是正常的。


想法取自:

enter image description here

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

附言我强烈推荐观看 Rob Volk 的演讲:Revenge: The SQL!

关于c# - Linq 查询未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36355811/

相关文章:

c# - Xamarin Forms 中没有 WebClient 类

sql-server - 消息 : This extension requires the Microsoft ODBC Driver 11 or 13 for SQL Server

sql-server - 使用 Merge NOT MATCHED 插入多行

c# - 如何在没有递归的情况下遍历这个树结构#

c# - 具有基本身份验证的 GET 请求适用于 Postman,但不适用于 C#

sql - 基于多行SQL过滤数据

c# - 我可以在使用自动映射器映射时在对象列表中添加行号吗?

wpf - Ninject ActivationBlock 作为工作单元

c# - 不支持 MySql EF 6 存储过程导入函数 EDM 类型

c# - 什么是NullReferenceException,如何解决?