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

时间:2014-01-06 15:12:11

标签: 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()查询失效。 / p>

我使用SQL事件探查器查找从.EndsWith()方法生成的确切sql。这是我发现的:

--previous query code removed for brevity
WHERE [Extent1].[SomeColumn] LIKE N'%sometext'

所以 很有趣。我不确定N'%sometext'之前的含义。 (我稍后会谷歌。)但我知道如果我采用相同的查询并在没有N的SSMS中运行它:

--previous query code removed for brevity
WHERE [Extent1].[SomeColumn] LIKE '%sometext'

然后查询工作正常。有没有办法让Linq和Entity Framework从查询中删除N

2 个答案:

答案 0 :(得分:2)

请试试这个......

.Where(x => x.SomeColumn.Trim().EndsWith("sometext"))

答案 1 :(得分:1)

刚刚与我的同事谈过类似问题,看看以下内容是否适用于您:

[Column(TypeName = "varchar")]
public string SomeColumn
{
    get;
    set;
}

显然在列映射上设置类型将强制查询将其识别为VARCHAR,其中字符串通常被解释为NVARCHAR