/// <summary> /// EndSwith方法解析 /// </summary> /// <param name="fieldType"></param> /// <param name="fieldName"></param> /// <param name="paramType"></param> /// <param name="paramName"></param> private void VisitMethodEndswith(Type fieldType, string fieldName, Type paramType, string paramName) { SqlList.Push(String.Format("{0} {1} LIKE {2}", fieldName, IsNot ? "Not" : "", paramName)); CurrentDbParameter.Value = string.Format("%{0}", CurrentDbParameter.Value); }
/// <summary> /// IsEquals方法解析 /// </summary> /// <param name="fieldType"></param> /// <param name="fieldName"></param> /// <param name="paramType"></param> /// <param name="paramName"></param> private void VisitMethodEquals(Type fieldType, string fieldName, Type paramType, string paramName) { SqlList.Push(String.Format("{0} {1} {2}", fieldName, IsNot ? "<>" : "=", paramName)); }
/// <summary> /// 操作符号 /// </summary> /// <param name="bexp">操作符号</param> /// <param name="left">操作符左边的SQL</param> /// <param name="right">操作符右边的SQL</param> protected override void VisitOperate(BinaryExpression bexp, string left, string right) { SqlList.Push($"{left} {VisitOperate(bexp, left)} {right}"); }
/// <summary> /// StartSwith方法解析 /// </summary> /// <param name="fieldType"></param> /// <param name="fieldName"></param> /// <param name="paramType"></param> /// <param name="paramName"></param> private void VisitMethodStartswith(Type fieldType, string fieldName, Type paramType, string paramName) { SqlList.Push(String.Format("CHARINDEX({0},{1}) {2} 1", paramName, fieldName, IsNot ? ">" : "=")); }
protected override Expression VisitMethodCall(MethodCallExpression m) { base.VisitMethodCall(m); if (ClearCallSql()) { return(m); } var methodName = m.Method.Name; if (IsIgnoreMethod(methodName)) { return(m); } #region 字段、参数、值类型 Type fieldType = null; Type paramType = null; string fieldName = null; string paramName = null; if (m.Arguments.Count > 0) { // 静态方法 Object = null if (m.Object == null) { if (!m.Arguments[0].Type.IsGenericType || m.Arguments[0].Type.GetGenericTypeDefinition() == typeof(Nullable <>)) { fieldType = m.Arguments[0].Type; fieldName = SqlList.Pop(); if (m.Arguments.Count > 1) { paramType = m.Arguments[1].Type; paramName = SqlList.Pop(); } } else { paramType = m.Arguments[0].Type; paramName = SqlList.Pop(); fieldType = m.Arguments[1].Type; fieldName = SqlList.Pop(); } } else { // 非List类型 if (!m.Object.Type.IsGenericType || m.Object.Type.GetGenericTypeDefinition() == typeof(Nullable <>)) { fieldType = m.Object.Type; if (m.Arguments.Count > 0) { paramType = m.Arguments[0].Type; paramName = SqlList.Pop(); } fieldName = SqlList.Pop(); } else { paramType = m.Object.Type; fieldType = m.Arguments[0].Type; paramName = SqlList.Pop(); fieldName = SqlList.Pop(); } } } #endregion switch (methodName) { case "Contains": VisitMethodContains(fieldType, fieldName, paramType, paramName); break; case "StartsWith": VisitMethodStartswith(fieldType, fieldName, paramType, paramName); break; case "EndsWith": VisitMethodEndswith(fieldType, fieldName, paramType, paramName); break; case "IsEquals": VisitMethodIsEquals(fieldType, fieldName, paramType, paramName); break; case "Equals": VisitMethodEquals(fieldType, fieldName, paramType, paramName); break; case "ToShortDate": VisitMethodToShortDate(fieldType, fieldName); break; default: { if (m.Arguments.Count == 0 && m.Object != null) { return(m); } throw new Exception(string.Format("暂不支持该方法的SQL转换:" + m.Method.Name.ToUpper())); } } IsNot = false; return(m); }
/// <summary> /// ToShortDate方法解析 /// </summary> /// <param name="fieldType"></param> /// <param name="fieldName"></param> protected virtual void VisitMethodToShortDate(Type fieldType, string fieldName) { SqlList.Push(String.Format("CONVERT(varchar(100), {0}, 23)", fieldName)); }
/// <summary> /// ToShortDate方法解析 /// </summary> /// <param name="fieldType"></param> /// <param name="fieldName"></param> protected virtual void VisitMethodToShortDate(Type fieldType, string fieldName) { SqlList.Push($"CONVERT(varchar(100), {fieldName}, 23)"); }
public new string Visit(Expression exp) { base.Visit(exp); return(ConvertHelper.ToString(SqlList.Reverse(), " AND ")); }
/// <summary> /// EndSwith方法解析 /// </summary> /// <param name="fieldType"></param> /// <param name="fieldName"></param> /// <param name="paramType"></param> /// <param name="paramName"></param> protected virtual void VisitMethodEndswith(Type fieldType, string fieldName, Type paramType, string paramName) { SqlList.Push($"{fieldName} {(IsNot ? "Not" : "")} LIKE {paramName}"); CurrentDbParameter.Value = $"%{CurrentDbParameter.Value}"; }
/// <summary> /// IsEquals方法解析 /// </summary> /// <param name="fieldType"></param> /// <param name="fieldName"></param> /// <param name="paramType"></param> /// <param name="paramName"></param> protected virtual void VisitMethodEquals(Type fieldType, string fieldName, Type paramType, string paramName) { SqlList.Push($"{fieldName} {(IsNot ? "<>" : "=")} {paramName}"); }
/// <summary> /// StartSwith方法解析 /// </summary> /// <param name="fieldType"></param> /// <param name="fieldName"></param> /// <param name="paramType"></param> /// <param name="paramName"></param> protected virtual void VisitMethodStartswith(Type fieldType, string fieldName, Type paramType, string paramName) { SqlList.Push($"CHARINDEX({paramName},{fieldName}) {(IsNot ? ">" : "=")} 1"); }
protected override Expression VisitMethodCall(MethodCallExpression m) { base.VisitMethodCall(m); if (ClearCallSql()) { return(m); } #region 字段、参数、值类型 Type fieldType = null; Type paramType = null; string fieldName = null; string paramName = null; if (m.Arguments.Count > 0) { if (m.Object == null) { if (!m.Arguments[0].Type.IsGenericType || m.Arguments[0].Type.GetGenericTypeDefinition() == typeof(Nullable <>)) { fieldType = m.Arguments[0].Type; paramType = m.Arguments[1].Type; fieldName = SqlList.Pop(); paramName = SqlList.Pop(); } else { paramType = m.Arguments[0].Type; fieldType = m.Arguments[1].Type; paramName = SqlList.Pop(); fieldName = SqlList.Pop(); } } else { if (!m.Object.Type.IsGenericType || m.Object.Type.GetGenericTypeDefinition() == typeof(Nullable <>)) { fieldType = m.Object.Type; if (m.Arguments.Count > 0) { paramType = m.Arguments[0].Type; paramName = SqlList.Pop(); } fieldName = SqlList.Pop(); } else { paramType = m.Object.Type; fieldType = m.Arguments[0].Type; paramName = SqlList.Pop(); fieldName = SqlList.Pop(); } } } #endregion switch (m.Method.Name.ToUpper()) { case "CONTAINS": VisitMethodContains(fieldType, fieldName, paramType, paramName); break; case "STARTSWITH": VisitMethodStartswith(fieldType, fieldName, paramType, paramName); break; case "ENDSWITH": VisitMethodEndswith(fieldType, fieldName, paramType, paramName); break; case "ISEQUALS": VisitMethodIsEquals(fieldType, fieldName, paramType, paramName); break; default: { if (m.Arguments.Count == 0 && m.Object != null) { return(m); } throw new Exception(string.Format("暂不支持该方法的SQL转换:" + m.Method.Name.ToUpper())); } } return(m); }
/// <summary> /// 加入字段到队列中 /// </summary> /// <param name="keyValue">当前字段属性</param> protected override void VisitMemberAccess(KeyValuePair <PropertyInfo, FieldState> keyValue) { SqlList.Push(keyValue.Value.FieldAtt.IsFun ? CurrentFieldName + " as " + keyValue.Key.Name : DbProvider.KeywordAegis(CurrentFieldName)); }
/// <summary> /// 将方法转换成T-SQL特殊函数名 /// </summary> /// <param name="m">自定义特殊的函数</param> protected override Expression VisitMethodCall(MethodCallExpression m) { base.VisitMethodCall(m); if (ClearCallSql()) { return(m); } #region 字段、参数、值类型 Type fieldType; Type paramType; string fieldName, paramName; if (m.Object == null) { if (!m.Arguments[0].Type.IsGenericType || m.Arguments[0].Type.GetGenericTypeDefinition() == typeof(Nullable <>)) { fieldType = m.Arguments[0].Type; paramType = m.Arguments[1].Type; fieldName = SqlList.Pop(); paramName = SqlList.Pop(); } else { paramType = m.Arguments[0].Type; fieldType = m.Arguments[1].Type; paramName = SqlList.Pop(); fieldName = SqlList.Pop(); } } else { if (!m.Object.Type.IsGenericType || m.Object.Type.GetGenericTypeDefinition() == typeof(Nullable <>)) { fieldType = m.Object.Type; paramType = m.Arguments[0].Type; paramName = SqlList.Pop(); fieldName = SqlList.Pop(); } else { paramType = m.Object.Type; fieldType = m.Arguments[0].Type; fieldName = SqlList.Pop(); paramName = SqlList.Pop(); } } #endregion switch (m.Method.Name.ToUpper()) { case "CONTAINS": { if (!paramType.IsGenericType || paramType.GetGenericTypeDefinition() == typeof(Nullable <>)) { #region 搜索值串的处理 var param = ParamsList.Find(o => o.ParameterName == paramName); if (param != null && IsType.IsDigital(param.Value.ToString()) && (Type.GetTypeCode(fieldType) == TypeCode.Int16 || Type.GetTypeCode(fieldType) == TypeCode.Int32 || Type.GetTypeCode(fieldType) == TypeCode.Decimal || Type.GetTypeCode(fieldType) == TypeCode.Double || Type.GetTypeCode(fieldType) == TypeCode.Int64 || Type.GetTypeCode(fieldType) == TypeCode.UInt16 || Type.GetTypeCode(fieldType) == TypeCode.UInt32 || Type.GetTypeCode(fieldType) == TypeCode.UInt64)) { param.Value = "," + param.Value + ","; param.DbType = DbType.String; if (dbProvider.CreateTableAegis("").Length > 0) { fieldName = "','+" + fieldName.Substring(1, fieldName.Length - 2) + "+','"; } else { fieldName = "','+" + fieldName + "+','"; } } #endregion SqlList.Push(String.Format("INSTR({1},{0}) > 0", paramName, fieldName)); } else { if (Type.GetTypeCode(fieldType) == TypeCode.String) { base.ParamsList.GetLast().Value = "'" + base.ParamsList.GetLast().Value.ToString().Replace(",", "','") + "'"; } SqlList.Push(String.Format("{0} IN ({1})", fieldName, base.ParamsList.GetLast().Value)); base.ParamsList.Remove(base.ParamsList.GetLast()); } break; } case "STARTSWITH": { SqlList.Push(String.Format("INSTR({0},{1}) = 1", fieldName, paramName)); break; } case "ENDSWITH": { SqlList.Push(String.Format("{0} LIKE {1}", fieldName, paramName)); ParamsList.GetLast().Value = string.Format("%{0}", ParamsList.GetLast().Value); break; } case "ISEQUALS": { SqlList.Push(String.Format("{0} = {1}", fieldName, paramName)); break; } default: { if (m.Arguments.Count == 0 && m.Object != null) { return(m); } else { return(VisitConvert(m)); throw new Exception(string.Format("暂不支持该方法的SQL转换:" + m.Method.Name.ToUpper())); } } } return(m); }
/// <summary> /// 操作符号 /// </summary> /// <param name="bexp">操作符号</param> /// <param name="left">操作符左边的SQL</param> /// <param name="right">操作符右边的SQL</param> protected override void VisitOperate(BinaryExpression bexp, string left, string right) { SqlList.Push(String.Format("{0} {1} {2}", left, VisitOperate(bexp, left), right)); }