转义LINQ中的特殊字符包含方法

时间:2014-06-08 10:37:14

标签: .net linq entity-framework

我在使用特殊字符匹配DB中的某些字符串时遇到问题,特别是:

var titleQuery = this.context.Objects.Where(o => o.Title.Contains("a."));

我想搜索的是完全包含“a”的字符串。 as substring(“a.sth”,“bla a.xxx”,...),但在此查询中,句点字符被解释为“任何字符”,因此我得到错误的结果。问题是我还没有找到如何逃避这个句点字符或如何更改此查询以获得正确的结果。

映射到DB:

Object.cs
---------

public partial class Object {
  ...
  public string Title { get; set; }
  ...
}

MyModel.Context.cs
------------------

public partial class MyEntities : DbContext {
  ...
  public DbSet<Object> Objects { get; set; }
  ...
}

我正在使用MS SQL Server 2008,VS 2012,.NET 4.5,EF 5.0.0。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

重要的是要记住,EF正在将表达式o.Title.Contains()转换为SQL。如何完成这取决于连接器resp。您正在访问的数据库(afaik)。 如果我使用MSSQL尝试此操作,则SQL会读取类似

的内容
SELECT * FROM [OBJECT] WHERE [OBJECT].[TITLE] LIKE '%a.%'

(“真正的”查询有点复杂的usind参数和一个表别名,但归结为这个...)

这可能会产生意想不到的效果,因为LIKE运算符的含义可能与C#中的Contains()函数不同。其中一个影响是比较可能以不区分大小写的方式完成(取决于DB列中使用的排序规则)。

我的猜测是你没有使用MS-SQL(它似乎适用于这个数据库...)

您可以使用

获取生成的SQL
titleQuery.ToString()

然后,您应该查阅数据库系统的文档,并尝试找出这个SQL在那里的行为。我会试着找出周期性角色应该如何逃脱。

不知道,你正在使用什么数据库,我担心这就是我现在所能说的......

希望它无论如何都有帮助:)