我正在使用 Linq 和 Entity Framework Code First 查询 MS SQL 数据库。要求是能够针对表运行 WHERE SomeColumn LIKE '%sometext'
子句。
从表面上看,这是一个简单的要求,可以使用如下简单的 Linq 查询来完成:
var results = new List<MyTable>();
using(var context = new MyContext())
{
results = context.MyTableQueryable
.Where(x => x.SomeColumn.EndsWith("sometext"))
.ToList();
}
// use results
然而,这在实践中并不有效。问题似乎是列 SomeColumn
不是 varchar,而是 char(31)。这意味着,如果在列中保存的字符串少于 31 个字符,则将在字符串末尾添加空格以确保长度为 31 个字符,这会弄乱 .EndsWith()
查询。
我使用 SQL Profiler 来查找从 .EndsWith()
方法生成的确切 SQL。这是我发现的:
--previous query code removed for brevity
WHERE [Extent1].[SomeColumn] LIKE N'%sometext'
所以这很有趣。我不确定 '%sometext'
之前的 N
是什么意思。 (我稍后会用 Google 搜索它。)但我确实知道,如果我采用相同的查询并在不带 N
的 SSMS 中运行它,如下所示:
--previous query code removed for brevity
WHERE [Extent1].[SomeColumn] LIKE '%sometext'
然后查询就可以正常工作了。有没有办法让 Linq 和 Entity Framework 从查询中删除 N
?
最佳答案
请尝试这个...
.Where(x => x.SomeColumn.Trim().EndsWith("sometext"))
关于sql - 如何更改 linq-to-entities 生成的 sql?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20952981/