【问题标题】:perform LIKE search with entity framework and npgsql使用实体框架和 npgsql 执行 LIKE 搜索
【发布时间】:2015-07-30 02:45:46
【问题描述】:

如何使用实体框架 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://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'的所有实体”

【问题讨论】:

  • 不是 100% 确定这一点,但我认为它需要 Npgsql EF6 提供程序中的一些特定支持,目前不存在。你能打开一个关于这个的问题吗(github.com/npgsql/npgsql)?不确定我们是否会很快解决这个问题......

标签: c# linq entity-framework postgresql npgsql


【解决方案1】:

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

例如来自Npgql repository 的单元测试之一:

[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));

【讨论】:

  • 测试位于EntityFramework7 文件夹中。我假设仅在您使用 EF7 时才支持此功能,或者!?
  • 是的,正则表达式映射是仅在(实验性)EF7 提供程序中实现的功能。
猜你喜欢
  • 1970-01-01
  • 2018-11-21
  • 2015-07-25
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多