C# Npgsql EF核心连接表达式

C# Npgsql EF核心连接表达式,c#,postgresql,entity-framework,npgsql,C#,Postgresql,Entity Framework,Npgsql,我有一个customer表,表中有firstname、lastname列和三元索引: 使用gin((firstname | lastname)gin_trgm_ops)在客户上创建索引ix_customer_search_trgm);“ 我正在尝试使用C#/EFCore按firstname或lastname搜索客户,但不知道如何为firstname | | lastname 我尝试了以下方法 dbContext.Customers.Where(q=>EF.Functions.ILike('fir

我有一个
customer
表,表中有
firstname
lastname
列和三元索引:

使用gin((firstname | lastname)gin_trgm_ops)在客户上创建索引ix_customer_search_trgm);“

我正在尝试使用C#/EFCore按firstname或lastname搜索客户,但不知道如何为
firstname | | lastname

我尝试了以下方法

  • dbContext.Customers.Where(q=>EF.Functions.ILike('firstname | | lastname',$“%{searchTerm}%”);
    这将生成一个如下所示的查询(注意,
    $1='f'
    ,看起来很奇怪),并且与列不匹配

  • 如何使用EF Core为上述方法指定连接表达式?

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

    dbContext.Customers.Where(q=>EF.Functions.ILike(q.FirstName+q.LastName,$“%{searchTerm}%”);
    ~~~
    
    与所有其他EF Core LINQ方法一样,ILike不接受集成到查询中的原始SQL字符串,而是接受EF Core为您翻译的.NET表达式。因此,您应该能够通过以下方式实现上述目标:

    dbContext.Customers.Where(q=>EF.Functions.ILike(q.FirstName+q.LastName,$“%{searchTerm}%”);
    ~~~
    
    谢谢@Shay this works!你能解释一下它是如何工作的吗?这只是出于我的好奇心(因为你知道所有的内部结构;)-我原以为在运行时
    ILike
    会收到表达式的值(即连接的firstname+lastname)与函数args一样,但它如何根据
    +
    运算符生成postgres特定语法?好吧,ILike与EF LINQ查询中的任何其他内容都没有区别…EF接收查询的表达式树表示(其中对ILike的调用只是树中的一个节点),然后将该树转换为正确的SQL表达式。ILike从未在.NET中实际调用过(它在.NET中没有实际的实现-它只是抛出)。这与您在Where子句中放置的任何其他内容相同(例如Where(b=>b.Name.StartsWith(“a”)。谢谢@Shay This!出于好奇,您能解释一下它是如何工作的吗(因为您了解所有内部内容;)-我原以为在运行时,
    ILike
    会收到表达式的值(即连接的firstname+lastname)与函数args一样,但它如何根据
    +
    运算符生成postgres特定语法?好吧,ILike与EF LINQ查询中的任何其他内容都没有区别…EF接收查询的表达式树表示(其中对ILike的调用只是树中的一个节点),然后将该树转换为正确的SQL表达式。ILike从未在.NET中实际调用过(它在.NET中没有实际实现-它只是抛出)。这与在Where子句中放置的任何其他内容相同(例如,Where(b=>b.Name.StartsWith(“a”))。
    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'
    
    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%'