繁体   English   中英

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

[英]perform LIKE search with entity framework and npgsql

如何使用实体框架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扩展方法WhereLikehttps : WhereLike

它是可行的,但并非在所有情况下都可行,因为它将搜索字符串分成了几个部分。

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”的字符串”

您可以使用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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM