[英]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扩展方法WhereLike
: https : 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()实现相同的目标。
[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.