【问题标题】:Npgsql EF Core concatenation expressionNpgsql EF Core 连接表达式
【发布时间】:2020-12-01 12:25:49
【问题描述】:

我有一个customer 表,其中包含firstnamelastname 列和一个三元组索引:

CREATE INDEX ix_customer_search_trgm ON customer USING gin ((firstname || lastname ) gin_trgm_ops);"

我正在尝试使用 C#/EFCore 按名字或姓氏搜索客户,但不知道如何为 firstname || lastname 指定串联表达式

我尝试了以下

  1. dbContext.Customers.Where(q => EF.Functions.ILike('firstname || lastname', $"%{searchTerm}%")); 这会生成如下查询(注意 $1 = 'f' 看起来很奇怪)并且与列不匹配
2020-12-01 23:04:52.119 AEDT [38091] LOG:  execute <unnamed>: SELECT ...
        FROM customer AS c
        WHERE $1

2020-12-01 23:04:52.119 AEDT [38091] DETAIL:  parameters: $1 = 'f'
  1. dbContext.Customers.Where(q =&gt; EF.Functions.ILike(q.firstname, $"%{searchTerm}%")); 这会生成我期望的那种查询,但显然只过滤表达式中的一列。
2020-12-01 23:02:21.777 AEDT [38034] LOG: execute <unnamed>: SELECT ...
        FROM customer AS c
        WHERE c.customer ILIKE $1 ESCAPE ''
2020-12-01 23:02:21.777 AEDT [38034] DETAIL:  parameters: $1 = '%abc%'

如何使用 EF Core 为上述内容指定串联表达式?

【问题讨论】:

    标签: c# postgresql entity-framework npgsql


    【解决方案1】:

    与所有其他 EF Core LINQ 方法一样,ILike 不接受集成到查询中的原始 SQL 字符串,而是接受 EF Core 为您翻译的 .NET 表达式。因此,您应该能够通过以下方式实现上述目标:

    dbContext.Customers.Where(q => EF.Functions.ILike(q.FirstName + q.LastName, $"%{searchTerm}%"));
    ~~~
    

    【讨论】:

    • 感谢@Shay 这行得通!你能解释一下它是如何工作的吗(因为你知道所有关于内部的知识;) - 我原以为在运行时ILike 会像往常一样接收表达式的值(即连接的名字+姓氏)与函数args 但它如何确定它应该基于 + 运算符生成特定于 postgres 的语法?
    • 嗯,ILike 与 EF LINQ 查询中的任何其他内容没有什么不同...... EF 接收查询的表达式树表示(其中调用 ILike 只是树中的一个节点),然后将该树转换为正确的 SQL 表达式。 ILike 从未在 .NET 中实际调用过(它在 .NET 中没有实际实现 - 它只是抛出)。这与您在 Where 子句中添加的任何其他内容相同(例如 Where(b => b.Name.StartsWith("A"))。
    猜你喜欢
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 2021-08-26
    • 1970-01-01
    相关资源
    最近更新 更多