LINQ在查询中插入'ESCAPE N'〜'

时间:2015-02-19 20:57:16

标签: sql linq entity-framework

当我检查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'~'

3 个答案:

答案 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();