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

标签 c# .net entity-framework-4 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 查询实际提交给 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 Collat​​es。

服务器端解决方案:

因此,最好的解决方案是将 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/

相关文章:

c# - System.Drawing.dll 中出现类型为 'System.ApplicationException' 的未处理异常

c# - 你能在一个事务中有多个 MySqlCommand 吗?

c# - LINQ:为什么我不能在返回的对象中声明新对象?

c# - 如何根据元素的值将xml反序列化为派生类?

c# - .NET 是否有 "Responsive Design + Server Side Components"(RESS) 框架

c# - 多参数线程

C# 我可以使用部分类来使代码更具可读性吗

entity-framework - 在 Entity Framework 4 中选择和更新多对多

entity-framework - 如何使用EF4 Code First在同一张表中进行多对多

c# - 如何过滤递归对象?