C# 使实体框架使用Contains而不是Like,并解释';逃逸';

C# 使实体框架使用Contains而不是Like,并解释';逃逸';,c#,entity-framework-6,C#,Entity Framework 6,我在EF中使用了一行LINQ,它基本上是做myTable.Where(c=>c.Contains('mystring') 这是生成的代码: SELECT TOP (300) [Extent1].[ID] AS [ID], [Extent1].[FKFishEntityID] AS [FKFishEntityID], [Extent1].[Fish] AS [Fish], [Extent1].[FishText] AS [FishText], [Extent1].[FishType] A

我在EF中使用了一行LINQ,它基本上是做
myTable.Where(c=>c.Contains('mystring')

这是生成的代码:

SELECT TOP (300) 
[Extent1].[ID] AS [ID], 
[Extent1].[FKFishEntityID] AS [FKFishEntityID], 
[Extent1].[Fish] AS [Fish], 
[Extent1].[FishText] AS [FishText], 
[Extent1].[FishType] AS [FishType]
FROM [dbo].[Fish] AS [Extent1]
WHERE [Extent1].[FishText] LIKE @p__linq__0 ESCAPE '~'
我的两个问题是:

  • 如何使用CONTAINS(…)而不是LIKE?当表使用全文索引时,LIKE的速度似乎非常慢。复制和粘贴查询需要4秒钟才能执行,但如果我将LIKE改为CONTAINS(),它会立即执行

  • 为什么它会逃逸“~”?通过将其复制并粘贴到SQL server中,如果我删除“转义”部分,它的执行速度将提高大约4倍


来自[实体框架博客]:

目前还没有计划对全文搜索的本地支持。您需要使用原始SQL查询

看来要走的路是这样的:

using (var context = new BloggingContext())
{
    var fishes = context.Fishes.SqlQuery("SELECT * FROM dbo.Fishes WHERE CONTAINS(FishText, @p0)", searchPhrase).ToList();
}

转义可能是由于避免使用通配符。请尝试将
mystring*
替换为
mystring
——在SQL Server中,它可能会被转换为
mystring~*
——因此,在通配符之前添加波浪符意味着它不是通配符,而恰恰是这个字符。嗯,添加*并没有什么区别。我认为它和,比如,如果我能解出第1点,它可能解出第2点,在什么意义上没有区别?您是否在sql server中查看了参数值(例如使用探查器)?我知道这并不能解决您的问题,也无助于解决您的问题——这只是关于为什么会出现转义的提示。是的,我正在使用探查器来检查SQL。它总是加上“~”。但是它没有第1点那么重要。@Pako你的意思是
%
。最后我创建了一个存储过程来执行一个简单的CONTAINS查询。