我使用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
?
答案 0 :(得分:2)
请试试这个......
.Where(x => x.SomeColumn.Trim().EndsWith("sometext"))
答案 1 :(得分:1)
刚刚与我的同事谈过类似问题,看看以下内容是否适用于您:
[Column(TypeName = "varchar")]
public string SomeColumn
{
get;
set;
}
显然在列映射上设置类型将强制查询将其识别为VARCHAR
,其中字符串通常被解释为NVARCHAR
。