You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Npgsql的EF Core能否生成含ILIKE ANY的大小写不敏感查询?

实现方案

可以通过以下几种方式实现生成ILIKE ANY的大小写不敏感查询:

方法一:使用EF.Functions.ILike结合Any

直接在LINQ查询中利用Npgsql提供的EF.Functions.ILike方法,配合数组的Any操作,Npgsql会自动将其转换为ILIKE ANY的SQL语句:

var symbols = new[] { "AAPL", "GOOG", "MSFT" };
var instruments = dbContext.Instruments
    .Where(t => symbols.Any(s => EF.Functions.ILike(t.Symbol, s)))
    .ToList();

该代码会生成符合预期的SQL:

SELECT [columns] FROM instruments WHERE symbol ILIKE ANY(ARRAY['AAPL', 'GOOG', 'MSFT'])

方法二:手动构造原生查询(参数化)

如果需要更直接控制SQL语句,可以使用FromSqlRaw编写原生SQL,同时通过参数化数组避免注入风险:

var symbols = new[] { "AAPL", "GOOG", "MSFT" };
var instruments = dbContext.Instruments
    .FromSqlRaw("SELECT * FROM instruments WHERE symbol ILIKE ANY({0})", symbols)
    .ToList();

Npgsql会自动将C#数组参数转换为PostgreSQL数组格式,确保查询安全合规。

方法三:封装复用逻辑(进阶)

如果需要在多处复用该查询逻辑,可以封装成扩展方法:

  1. 定义静态扩展方法:
public static class InstrumentQueryExtensions
{
    public static IQueryable<Instrument> WhereSymbolILikeAny(this IQueryable<Instrument> query, string[] symbols)
    {
        return query.Where(t => symbols.Any(s => EF.Functions.ILike(t.Symbol, s)));
    }
}
  1. 调用时简化代码:
var symbols = new[] { "AAPL", "GOOG", "MSFT" };
var instruments = dbContext.Instruments.WhereSymbolILikeAny(symbols).ToList();

内容的提问来源于stack exchange,提问作者Vishal Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 01:42:38