sql - 如何更改 linq-to-entities 生成的 sql?

标签 sql linq entity-framework entity-framework-5

我正在使用 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/

相关文章:

c# - 如何在 orderby 子句中使用带有动态参数的 LINQ

c# - LINQ 比较两个列表并删除

entity-framework - Entity Framework 代码优先和存储过程

entity-framework - 在 Entity Framework v1 中添加和更新外键

sql - 从数据库中的每个用户获取最后一个条目

c# - LINQ 到 XML : How to get all elements by value

sql - 如何从分组中计算总和值

c# - 使用 LINQ to SQL 左连接

sql - 是否可以将一个表中的所有数据复制到另一个表中,再加上一个额外的列?

python - ProgrammingError : (psycopg2. errors.UndefinedColumn),同时使用 sqlalchemy