当我检查linq吐出的sql查询时,我注意到它在执行LIKE命令时放置了一个ESCAPE N'〜'。我怎么摆脱这个?似乎查询需要两倍的时间,ESCAPE在sql中。
这是LINQ
var SearchPhrase = "xyz";
var result = (from I in db.myTabl
where i.col1.contains(SearchPhrase)
select I).toList();
当我查看实际的sql
时它看起来像这样:
SELECT
[Extent1].Col1
FROM myTable As [Extent1]
WHERE [Extent1].Col1 LIKE @p__linq__3 ESCAPE N'~'
答案 0 :(得分:5)
显然,
var SearchPhrase = "xyz";
var result = (from I in db.myTabl
where i.col1.contains(SearchPhrase)
select I).toList();
将添加ESCAPE N'〜'在基础查询中。
但是,使用如下所示的常量过滤器,不会在基础查询中生成转义字符
var result = (from I in db.myTabl
where i.col1.contains("xyz")
select I).toList();
这意味着,变量过滤器是转义的,而常量则不是。
因此,在这种情况下,我们需要一个变量用作常量过滤器。
使用以下内容,不应添加任何转义字符:
var SearchPhrase = "xyz";
var result = (from I in db.myTabl
where SqlMethods.Like(i.col1, string.Format("%{0}%", SearchPhrase))
select I).toList();
但这仅适用于LINQ to SQL。
另一种方法是将变量值嵌入为常量,使用以下SO article
中的说明完成答案 1 :(得分:0)
Linq to Sql使用'`'作为比较时的默认转义字符。如果你的字符串实际上包含〜字符,它只会导致问题。
使用SqlMethods.Like覆盖此内容。
答案 2 :(得分:-1)
如果您使用LINQ 2实体,请使用SqlQuery
删除“〜”字符。
只需像普通的sql查询一样附加值进行比较。
例如:
var resultList = context.TableName.SqlQuery(
"SELECT * FROM TableName WHERE field LIKE '%" + fieldValue+ "%' ").ToList();