c# – LINQ to Entities区分大小写的比较

这不是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 Server的生成的SQL查询揭示了一个谜团:

string sqlQuery = ((ObjectQuery)context.Thingies
        .Where(t => t.Name == "ThingamaBob")).ToTraceString();

当您创建LINQ to Entities查询时,LINQ to Entities利用LINQ解析器开始处理查询并将其转换为LINQ表达式树.然后将LINQ表达式树传递给Object Services API,后者将表达式树转换为命令树.然后将其发送到商店提供商(例如SqlClient),后者将命令树转换为本机数据库命令文本.查询在数据存储上执行,结果通过对象服务实现为实体对象.在考虑区分大小写之间没有任何逻辑.因此,无论您在谓词中添加什么案例,除非您更改该列的SQL Server Collat​​es,否则它将始终视为您的SQL Server.

服务器端解决方案

因此,最好的解决方案是将Thingies表中Name列的排序规则更改为COLLATE Latin1_General_CS_AS,它通过在SQL Server上运行它来区分大小写:

ALTER TABLE Thingies
ALTER COLUMN Name VARCHAR(25)
COLLATE Latin1_General_CS_AS

有关SQL Server Collat​​es的更多信息,请查看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区分大小写的比较 - 代码日志