使用实体框架和npgsql执行LIKE搜索

本文关键字:执行 LIKE 搜索 npgsql 实体 框架 | 更新日期: 2023-09-27 18:05:15

如何使用实体框架6和npgsql执行LIKE搜索?

我试过

1.SQLMethods.Like

queryable.Where(entity => SqlMethods.Like(entity.Name, "%EW%6%"));

但是我收到了的消息

LINQ to Entities无法识别方法"Boolean Like(System.String,System.String("方法,并且此方法无法转换为存储表达式。


2.linq扩展方法

然后我尝试了这个stackoverflow帖子中的linq扩展方法WhereLike:https://stackoverflow.com/a/27153779/1489968

它是有效的,但并非适用于所有情况,因为它将搜索字符串分割为多个部分。

queryable.WhereLike(t => t.Name, "%EW%6%"));

被转换为两个连接的Contains调用,这两个调用被转换成两个LIKE表达式。

SELECT ... 
WHERE ... AND 
("Extent1"."name" LIKE E'%EU%' AND "Extent1"."name" LIKE E'%6%')

这意味着"名称包含'EU'和'6'的所有实体">

但我希望转换产生如下查询:

SELECT ... 
WHERE ... AND
("Extent1"."name" LIKE E'%EW%6%')

这意味着"名称包含'EU',后跟字符串,包含'6'的所有实体">

使用实体框架和npgsql执行LIKE搜索

使用Regex.IsMatch((.可以实现相同的目标

例如,Npgql存储库中的一个单元测试:

[Fact]
public virtual void Regex_IsMatchOptionsNone()
{
    AssertQuery<Customer>(
        cs => cs.Where(c => Regex.IsMatch(c.CompanyName, "^A", RegexOptions.None)),
        entryCount: 4);
    Assert.Contains("WHERE '"c'".'"CompanyName'" ~ ('(?p)' || '^A')", Sql);
}

所以我相信在你的情况下,它会看起来像这样:

var pattern = ".*" + Regex.Escape("EW") + ".*" + Regex.Escape("6") + ".*";
queryable.Where(t => Regex.IsMatch(t.Name, pattern));