【问题标题】:Make Entity Framework use Contains instead of Like and explain 'ESCAPE ~'使实体框架使用 Contains 而不是 Like 并解释 'ESCAPE ~'
【发布时间】:2013-06-05 22:12:14
【问题描述】:

我有一行 LINQ,我在 EF 中使用它基本上是在做 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() 它会立即执行。

  • 为什么要 ESCAPE '~' ?通过将其复制并粘贴到 SQL Server 中,如果我删除 'ESCAPE' 部分,它的执行速度会快 4 倍左右。

【问题讨论】:

  • 转义可能是因为避免使用通配符。尝试使用 mystring* 而不是 mystring - 在 SQL Server 中,它可能会被传输为 mystring~* - 因此转义说通配符之前的波浪字符意味着它不是通配符,而是这个字符。
  • 嗯,添加 * 并没有什么不同。我认为它与 LIKE 相关,所以如果我能解决第 1 点,它可能会解决第 2 点
  • 在什么意义上没有影响?您是否查看过 sql server 中的参数值(例如使用探查器)?我知道这并不能解决您的问题或帮助 - 它只是提示为什么存在转义。
  • 是的,我正在使用分析器来检查 SQL。它总是添加'〜'。不过,它不像第 1 点那么重要。
  • @Pako 你的意思是%

标签: c# entity-framework-6


【解决方案1】:

来自[实体框架博客]:1

目前没有计划对全文搜索提供原生支持。您需要使用原始 SQL 查询。

似乎要走的路是这样的:

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

【讨论】:

  • 最后我创建了一个存储过程来做一个简单的 CONTAINS 查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 2013-03-17
  • 2013-08-10
相关资源
最近更新 更多