【问题标题】:Converting a SQL contains query for Entity Framework转换 SQL 包含实体框架的查询
【发布时间】:2018-03-09 20:02:05
【问题描述】:

我目前正在针对实体框架将一些 SQL 转换为 C# 代码,并且遇到了关键字搜索查询的问题。

(非常)简化的查询最终看起来像这样:

SELECT * FROM SomeTable
WHERE CONTAINS(Col1, Col2, Col3, '"word"')

根据文档https://docs.microsoft.com/en-us/sql/t-sql/queries/contains-transact-sql,此方法搜索单词或短语的模糊或精确匹配。因此,如果我搜索关键字“word”,我将得到 Col1、Col2 或 Col3 具有“word”实例的结果。

我已经尝试针对实体框架编写一个包含字符串的方法:

Context.Where(i => i.Col1.Contains("word") || i.Col2.Contains("word") || i.Col3.Contains("word"))

但是,这会产生一个通配符,如查询 '%word%' 并返回不相关的结果,例如,我得到了“word”和“swords”的匹配项。

如何获得与 SQL 包含查询相同的结果?

【问题讨论】:

  • 所以所有 cols 都需要专门返回 word 而没有别的?
  • 有没有可用的equals()方法?
  • 所以keyword 返回wordswords?您可能必须使用正则表达式而不是 Contains
  • 抱歉,我使用的措辞可能不清楚该示例。我将更新关键字以使其更加清晰。
  • 没有办法,但是可以使用一些(丑陋的)变通方法,例如:entityframework.info/Home/FullTextSearch

标签: c# sql entity-framework


【解决方案1】:

您必须编写一个自定义 SQL 函数并从 C# 中调用它。

例如:

CREATE FUNCTION [dbo].[Search](@Search nvarchar(4000))
RETURNS TABLE
AS
RETURN (
    SELECT 
        *
    FROM 
        [dbo].[SomeTable]
    WHERE 
        CONTAINS(Col1, Col2, Col3, @Search)
)
GO

当它生成到 EDMX 时,像这样使用它

var query = this.DataContext.Search("my search string");

【讨论】:

  • 我猜他正在寻找 C# 代码 - EF,而不是 SQL 查询
  • 所以你的意思是没有 sql 包含实体框架的等效项?
  • 没有原生的——你只需要创建 SQL 函数并从 EF 调用或使用 SqlQuery 使用原始查询,或者你也可以创建一些自己的表达式访问者,它会像包含一样发生变化。
  • 谢谢,我会记住这一点。我试图尽可能避免使用自定义 sql 查询,但如果没有其他方法,至少我有这个选项。
【解决方案2】:

尝试使用 SqlMethods.Like

例子:

Context.Where(x=> SqlMethods.Like(x.Col1,'word') 
||SqlMethods.Like(x.Col2,'word')).ToList();

可以在System.Data.Linq.SqlClient下找到SqlMethods;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    相关资源
    最近更新 更多