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

在Entity Framework与PostgreSQL中实现AI&CI搜索,是否有更简便方案?

更简洁实现EF+PostgreSQL不区分重音与大小写搜索的方法

方案一:数据库列排序规则配置

直接在PostgreSQL层面为目标列设置**不区分重音(AI)+不区分大小写(CI)**的排序规则,无需在查询中嵌套EF.Functions,普通Contains查询即可自动生效:

  • 建表时指定排序规则:
    CREATE TABLE Users (
        Id SERIAL PRIMARY KEY,
        Name VARCHAR(255) COLLATE "und-ks-level2-ci" -- 通用多语言不区分大小写和重音的排序规则
    );
    
  • 已有表修改列规则:
    ALTER TABLE Users ALTER COLUMN Name TYPE VARCHAR(255) COLLATE "und-ks-level2-ci";
    
  • EF查询代码简化为:
    dbContext.Users.Where(u => u.Name.Contains(value));
    
    该方案优势是代码最简洁,且数据库可通过索引优化查询性能,适合能修改数据库结构的场景。

方案二:自定义EF查询扩展方法

如果无法修改数据库结构,可封装扩展方法统一处理重复的EF.Functions调用:

public static class QueryableExtensions
{
    public static IQueryable<T> WhereUnaccentedCaseInsensitive<T>(this IQueryable<T> query, 
        Expression<Func<T, string>> propertySelector, string value)
    {
        var pattern = EF.Functions.Unaccent($"%{value}%");
        var propertyExpr = propertySelector.Body as MemberExpression;
        var unaccentedProperty = Expression.Call(
            typeof(NpgsqlDbFunctionsExtensions),
            nameof(NpgsqlDbFunctionsExtensions.Unaccent),
            Type.EmptyTypes,
            EF.Functions,
            Expression.Convert(propertyExpr, typeof(string))
        );
        var likeExpr = Expression.Call(
            typeof(NpgsqlDbFunctionsExtensions),
            nameof(NpgsqlDbFunctionsExtensions.ILike),
            Type.EmptyTypes,
            EF.Functions,
            unaccentedProperty,
            Expression.Constant(pattern)
        );
        var filterLambda = Expression.Lambda<Func<T, bool>>(likeExpr, propertySelector.Parameters);
        return query.Where(filterLambda);
    }
}

使用时只需调用扩展方法:

dbContext.Users.WhereUnaccentedCaseInsensitive(u => u.Name, value);

方案三:Npgsql全局文本处理配置

通过Npgsql的全局配置,让Contains自动转换为带去重音和大小写忽略的查询:

  • 在DbContext的OnConfiguring中添加配置:
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql("你的连接字符串", o =>
            o.ConfigureWarnings(w => w.Ignore(NpgsqlEventId.UnaccentFunctionNotFound)));
    }
    
    配合自定义表达式访问器(需额外实现表达式树转换逻辑),可让常规的字符串查询自动应用去重音和大小写忽略,适合需要全局统一规则的场景。

内容的提问来源于stack exchange,提问作者Max Bündchen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:42:06