修复Subsonic多表条件查询bug
SqlQueryquery = 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;
}