コード例 #1
0
 /// <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);
 }
コード例 #2
0
 /// <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));
 }
コード例 #3
0
 /// <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}");
 }
コード例 #4
0
 /// <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 ? ">" : "="));
 }
コード例 #5
0
ファイル: ExpressionBool.cs プロジェクト: ciker/Farseer.Net
        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);
        }
コード例 #6
0
ファイル: ExpressionBool.cs プロジェクト: ciker/Farseer.Net
 /// <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));
 }
コード例 #7
0
 /// <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)");
 }
コード例 #8
0
 public new string Visit(Expression exp)
 {
     base.Visit(exp);
     return(ConvertHelper.ToString(SqlList.Reverse(), " AND "));
 }
コード例 #9
0
 /// <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}";
 }
コード例 #10
0
 /// <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}");
 }
コード例 #11
0
 /// <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");
 }
コード例 #12
0
ファイル: ExpressionBool.cs プロジェクト: zwwhnly/Farseer.net
        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);
        }
コード例 #13
0
 /// <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));
 }
コード例 #14
0
        /// <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);
        }
コード例 #15
0
 /// <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));
 }