修复Subsonic多表条件查询bug

 

SqlQuery query = new Select().From(Tables.UserBilling);
query .InnerJoin(UserInfo.UserIdColumn, UserBilling.UserIdColumn);

query.Where("UserInfo.UserId").IsEqualTo(1);

 

UserBilling、UserInfo表中多含有UserId字段,所以在加条件查询的时候需要指定表名,可是一旦指定了表名就会抛异常

Incorrect syntax near '.'.
Must declare the scalar variable "@UserId".

 

查看了Subsonic的源码,发现问题出在PrefixParameter(Utility.cs)方法,因为它把参数设置为@UserInfo.UserId,而这个在执行的时候,肯定是不正确的,我的做法是查找是否含有字符(.)如果有的话就取.号后面的字符串。

 

   /// <summary>
        /// Prefixes the passed parameter value with the provider specific parameter prefix.
        /// </summary>
        /// <param name="parameter">The parameter to evaluate</param>
        /// <param name="provider">The provider where the parameter will be used</param>
        /// <returns></returns>
        public static string PrefixParameter(string parameter, DataProvider provider)
        {
            //added this check for Unit Testing weirdness - RC
            if(provider == null)
                provider = DataService.Provider;

            string prefix = provider.GetParameterPrefix();

            if (!parameter.StartsWith(prefix))
            {
                //2009-12-25 修正多表关联且含同一字段的条件查询(产生的参数名称,只取.后面的字符)
                parameter = parameter.IndexOf(".") == -1 ? parameter : parameter.Substring(parameter.IndexOf(".") + 1);
                parameter = String.Concat(prefix, parameter.Replace(" ", String.Empty));
            }
            return parameter;
        }

 

posted @ 2009-12-25 12:45  Jolly-zhang  阅读(594)  评论(1编辑  收藏  举报