在SubSonic 3中转换列名和表名的正确方法

时间:2009-12-16 21:19:59

标签: subsonic subsonic3

我正在尝试使用ActiveRecord模板将名为app_user的表(其中包含名为created_dt的列转换为SubSonic3中的AppUser.CreatedDt)。从我所看到的,应该能够在Settings.ttinclude的CleanUp方法中根据需要修改表名和列名

所以我将此方法添加到Settings.ttinclude

string UnderscoreToCamelCase(string input)  {

        if( !input.Contains("_"))
            return input;

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < input.Length; i++)
        {
            if (input[i] == '_')
            {
                while (i < input.Length && input[i] == '_')
                    i++;
                if (i < input.Length)
                    sb.Append(input[i].ToString().ToUpper());
            }
            else
            {
                if (sb.Length == 0)
                    sb.Append(input[i].ToString().ToUpper());
                else
                    sb.Append(input[i]);
            }
        }

        return sb.ToString();
    }

然后调用CleanUp

result=UnderscoreToCamelCase(result);

如果我运行查询,例如:

var count = (from u in AppUser.All()
             where u.CreatedDt >= DateTime.Parse("1/1/2009 0:0:0")
             select u).Count();

我收到NotSupportedException,不支持成员'CreatedDt'

来自TSqlFormatter.sql第152行中的方法

protected override Expression VisitMemberAccess(MemberExpression m)

如果我注释掉对UnderscoreToCamelCase的调用并使用数据库中的名称,一切正常。

有趣的是,当一切正常时,OKMemberAccess方法永远不会被调用。

是否还有其他人能够将带有下层的表/列名称转换为SubSonic3中的驼峰案例?

1 个答案:

答案 0 :(得分:0)

在StackOverflow中的另一个线程上可能有一个答案,但它需要修改Subsonic.core的源代码。 link text