这不是 LINQ to Entities 中区分大小写的比较:
Thingies.First(t => t.Name == "ThingamaBob");
如何使用 LINQ to Entities 实现区分大小写的比较?
最佳答案
那是因为您正在使用 LINQ To Entities,它最终会将您的 Lambda 表达式转换为 SQL 语句。这意味着区分大小写取决于您的 SQL Server,它默认具有 SQL_Latin1_General_CP1_CI_AS 排序规则,并且不区分大小写。
使用 ObjectQuery.ToTraceString 看到生成的 SQL 查询实际提交给 SQL Server 就揭开了谜底:
string sqlQuery = ((ObjectQuery)context.Thingies
.Where(t => t.Name == "ThingamaBob")).ToTraceString();
当您创建 LINQ to Entities 查询时,LINQ to Entities 利用 LINQ 解析器开始处理查询并将其转换为 LINQ 表达式树。然后将 LINQ 表达式树传递给 Object Services API,将表达式树转换为命令树。然后将其发送到存储提供程序(例如 SqlClient),后者将命令树转换为 native 数据库命令文本。查询在数据存储上执行,结果由对象服务物化为实体对象。两者之间没有逻辑来考虑区分大小写。因此,无论您在谓词中放入什么大小写,您的 SQL Server 都会始终将其视为相同,除非您更改该列的 SQL Server Collates。
服务器端解决方案:
因此,最好的解决方案是将 Thingies 表中的 Name 列的排序规则更改为 COLLATE Latin1_General_CS_AS 在 SQL Server 上运行它是区分大小写的:
ALTER TABLE Thingies
ALTER COLUMN Name VARCHAR(25)
COLLATE Latin1_General_CS_AS
有关SQL Server 整理的更多信息,请查看SQL SERVER Collate Case Sensitive SQL Query Search
客户端解决方案:
您可以在客户端应用的唯一解决方案是使用 LINQ to Objects 进行另一个似乎不太优雅的比较:
Thingies.Where(t => t.Name == "ThingamaBob")
.AsEnumerable()
.First(t => t.Name == "ThingamaBob");
关于c# - LINQ to Entities 区分大小写比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3843060/