设置方法解析器

设置方法解析器

例:对如下 StringLike 方法解析

public static class DbFunctions
{
    public static bool StringLike(this string str, string value)
    {
        return str.Contains(value);
    }
}

1. 添加一个继承 IMethodHandler 的类,并实现 CanProcess 和 Process 两个方法

public class PostgreSQL_StringLike_MethodHandler : IMethodHandler
{
    /// <summary>
    /// 判断是否可以解析传入的方法。
    /// </summary>
    /// <param name="exp"></param>
    /// <returns></returns>
    public bool CanProcess(DbMethodCallExpression exp)
    {
        if (exp.Method.DeclaringType != typeof(DbFunctions))
            return false;

        return true;
    }

    /// <summary>
    /// 解析传入的方法。
    /// </summary>
    /// <param name="exp"></param>
    /// <param name="generator"></param>
    public void Process(DbMethodCallExpression exp, SqlGeneratorBase generator)
    {
        exp.Arguments[0].Accept(generator);
        generator.SqlBuilder.Append(" LIKE '%' || ");
        exp.Arguments[1].Accept(generator);
        generator.SqlBuilder.Append(" || '%'");
    }
}

2. 在程序启动时配置解析器

PostgreSQLContext.SetMethodHandler("StringLike", new PostgreSQL_StringLike_MethodHandler());

3. 在 lambda 表达式中使用

query.Where(a => DbFunctions.StringLike(a.Name, "Chloe")}).ToList();
/*
 * SELECT * FROM "person" AS "person" WHERE "person"."name" LIKE '%' || N'Chloe' || '%'
 */

更多用法参考 https://github.com/shuxinqin/Chloe/tree/master/src/ChloeDemo