Skip to content

Method handler

shuxin edited this page Oct 31, 2023 · 3 revisions

设置方法解析器

框架并未对数据库所有的特性做支持,有些函数或语法得需要自己翻译,Chloe.ORM 提供了相应的支持接口,参考如下:

例:对如下 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());
//其他库请调用其他库上下文对象下的 SetMethodHandler 方法设置。

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