使用实体框架和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'的所有实体">
使用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));