示例#1
0
        static StringBuilder ExpressionRouter(this AbstractService dataSource, Expression exp, DirAway away, ref int index, ref List <DbParameter> paramerList, bool isFunc = false)
        {
            var sb = new StringBuilder();

            if (exp is BinaryExpression)
            {
                var be = ((BinaryExpression)exp);
                sb = BinarExpressionProvider(dataSource, be.Left, be.Right, be.NodeType, ref index, ref paramerList);
            }
            else if (exp is MemberExpression)
            {
                var me = ((MemberExpression)exp);

                if (away == DirAway.Left)
                {
                    sb.Append(GetFieldName(me.Member));
                }
                else
                {
                    //把member的值读出来
                    sb = ExpressionRouter(dataSource, GetReduceOrConstant(me), away, ref index, ref paramerList, isFunc);
                }
            }
            else if (exp is NewArrayExpression)
            {
                var ae = ((NewArrayExpression)exp);
                if (isFunc)
                {
                    var tmpstr = new StringBuilder();
                    foreach (var ex in ae.Expressions)
                    {
                        tmpstr.Append(ExpressionRouter(dataSource, ex, DirAway.Left, ref index, ref paramerList));
                        tmpstr.Append(",");
                    }

                    if (tmpstr.Length > 0)
                    {
                        tmpstr.Length = tmpstr.Length - 1;
                        var result = dataSource.DbProvider.ParameterPrefix + "fs_param_" + index;

                        sb.Append(result);
                        paramerList.Add(dataSource.CreateParameter(result, tmpstr.ToString()));
                        index++;
                    }
                }
                else
                {
                    var tmpstr     = new StringBuilder();
                    var arrayIndex = 0;
                    foreach (var ex in ae.Expressions)
                    {
                        var result = string.Concat(dataSource.DbProvider.ParameterPrefix, "arr_param_", index, "_" + arrayIndex);
                        var value  = ExpressionRouter(dataSource, ex, DirAway.Left, ref index, ref paramerList);

                        paramerList.Add(dataSource.CreateParameter(result, value.ToString()));

                        tmpstr.Append(result);
                        tmpstr.Append(",");

                        arrayIndex++;
                    }

                    if (tmpstr.Length > 0)
                    {
                        tmpstr.Length = tmpstr.Length - 1;
                        sb.Append(tmpstr);
                        index++;
                    }
                }
            }
            else if (exp is MethodCallExpression)
            {
                var mce = (MethodCallExpression)exp;
                if (mce.Method.Name == "Like")
                {
                    sb.AppendFormat("({0} LIKE {1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
                }
                else if (mce.Method.Name == "NotLike")
                {
                    sb.AppendFormat("({0} NOT LIKE {1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
                }
                else if (mce.Method.Name == "In")
                {
                    sb.AppendFormat("{0} IN ({1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
                }
                else if (mce.Method.Name == "NotIn")
                {
                    sb.AppendFormat("{0} NOT IN ({1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
                }
                else if (mce.Method.Name == "InFunc")
                {
                    var leftString  = ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList);
                    var rightString = ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList, true);

                    var infunc = dataSource.ThePagerGenerator.GetInFunc(() =>
                    {
                        return(leftString);
                    }, () =>
                    {
                        return(rightString);
                    });

                    sb.Append(infunc);
                }
                else if (mce.Method.Name == "NotInFunc")
                {
                    var leftString  = ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList);
                    var rightString = ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList, true);

                    var infunc = dataSource.ThePagerGenerator.GetNotInFunc(() =>
                    {
                        return(leftString);
                    }, () =>
                    {
                        return(rightString);
                    });

                    sb.Append(infunc);
                }
                else if (away == DirAway.Right)
                {
                    sb.Append(ExpressionRouter(dataSource, GetReduceOrConstant(mce), away, ref index, ref paramerList, isFunc));
                }
            }
            else if (exp is ConstantExpression)
            {
                var ce = ((ConstantExpression)exp);
                if (away == DirAway.Right)
                {
                    if (!(ce.Value is Array))
                    {
                        var result = dataSource.DbProvider.ParameterPrefix + "wh_param_" + index;
                        sb.Append(result);
                        if (ce.Value == null || ce.Value is DBNull)
                        {
                            paramerList.Add(dataSource.CreateParameter(result, DBNull.Value));
                        }
                        else if (ce.Value is ValueType)
                        {
                            paramerList.Add(dataSource.CreateParameter(result, ce.Value));

                            //return ce.Value.ToString();
                        }
                        else if (ce.Value is string || ce.Value is DateTime || ce.Value is char)
                        {
                            paramerList.Add(dataSource.CreateParameter(result, ce.Value));
                            //return string.Format("'{0}'", ce.Value.ToString());
                        }
                        index++;
                    }
                    else
                    {
                        var arrayData = (Array)ce.Value;
                        var list      = new List <Expression>();
                        foreach (var item in arrayData)
                        {
                            list.Add(Expression.Constant(item));
                        }

                        sb.Append(ExpressionRouter(dataSource, Expression.NewArrayInit(arrayData.GetValue(0).GetType(), list), away, ref index, ref paramerList, isFunc));
                    }
                }
                else
                {
                    if (ce.Value == null)
                    {
                        sb.Append("null");
                    }
                    else
                    {
                        sb.Append(ce.Value);
                    }
                }
            }
            else if (exp is UnaryExpression)
            {
                var ue = ((UnaryExpression)exp);
                return(ExpressionRouter(dataSource, ue.Operand, away, ref index, ref paramerList, isFunc));
            }
            else
            {
                sb.Append(ExpressionRouter(dataSource, GetReduceOrConstant(exp), away, ref index, ref paramerList, isFunc));
            }

            return(sb);
        }
示例#2
0
        /// <summary>
        /// 更新语句生成
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="exp"></param>
        /// <param name="index"></param>
        /// <param name="paramerList"></param>
        /// <returns></returns>
        static StringBuilder ExpressionInsertRouter <T>(this AbstractService dataSource, Expression exp, DirAway away, ref int index, ref object newID, ref List <DbParameter> paramerList, IGenerator generater) where T : new()
        {
            var result = new StringBuilder();

            if (exp is MemberInitExpression)
            {
                var minit   = (MemberInitExpression)exp;
                var sbField = new StringBuilder();
                var sbValue = new StringBuilder();
                foreach (var item in minit.Bindings)
                {
                    if (item is MemberAssignment)
                    {
                        var myItem = (MemberAssignment)item;

                        var isKey   = false;
                        var isAuto  = false;
                        var keyType = KeyType.SEQ;

                        var fieldName = myItem.Member.Name;

                        var oArr = myItem.Member.GetCustomAttributes(true);
                        for (int i = 0; i < oArr.Length; i++)
                        {
                            if (oArr[i] is DataFieldAttribute)
                            {
                                var df = (DataFieldAttribute)oArr[i];
                                fieldName = df.FieldName;
                                isKey     = df.IsKey;
                                isAuto    = df.IsAuto;
                                keyType   = df.KeyType;
                            }
                        }

                        if (isKey && isAuto)
                        {
                            if (keyType == KeyType.SEQ)
                            {
                                dataSource.ThePagerGenerator.ProcessInsertId <T>(fieldName, ref sbField, ref sbValue);
                                continue;
                            }
                            else
                            {
                                newID = GetMemberExpressionValue(myItem.Expression);

                                if (newID != null && !string.IsNullOrEmpty(newID.ToString()))
                                {
                                    try
                                    {
                                        var currentLongId = (long)newID.ChangeType(typeof(long));
                                        if (currentLongId <= 0)
                                        {
                                            newID = generater.Generate();
                                        }
                                    }
                                    catch
                                    {
                                    }
                                }
                                else
                                {
                                    newID = generater.Generate();
                                }

                                sbField.Append(fieldName);
                                sbField.Append(",");
                                sbValue.Append(ExpressionInsertRouter <T>(dataSource, Expression.Constant(newID), DirAway.Right, ref index, ref newID, ref paramerList, generater));
                                sbValue.Append(",");
                            }
                        }
                        else
                        {
                            sbField.Append(fieldName);
                            sbField.Append(",");
                            sbValue.Append(ExpressionInsertRouter <T>(dataSource, myItem.Expression, DirAway.Right, ref index, ref newID, ref paramerList, generater));
                            sbValue.Append(",");
                        }
                    }
                }
                if (sbField.Length > 0)
                {
                    sbField.Length = sbField.Length - 1;
                    sbValue.Length = sbValue.Length - 1;
                }
                result.AppendFormat("({0})VALUES({1})", sbField, sbValue);
            }
            else if (exp is MemberExpression)
            {
                var mbe = (MemberExpression)exp;
                if (mbe.Member.MemberType == MemberTypes.Property)
                {
                    if (away == DirAway.Left)
                    {
                        result = new StringBuilder(GetFieldName(mbe.Member));
                    }
                    else
                    {
                        result = ExpressionInsertRouter <T>(dataSource, GetReduceOrConstant(mbe), away, ref index, ref newID, ref paramerList, generater);
                    }
                }
                else
                {
                    if (mbe.Member.MemberType == MemberTypes.Field)
                    {
                        if (away == DirAway.Left)
                        {
                            T maValue = default(T);
                            try
                            {
                                maValue = (T)GetMemberExpressionValue(mbe);
                            }
                            catch (Exception)
                            {
                            }
                            if (maValue != null)
                            {
                                var memberList = new List <MemberBinding>();
                                var mbeType    = typeof(T);
                                foreach (var member in mbeType.GetProperties())
                                {
                                    if (member.MemberType == MemberTypes.Property)
                                    {
                                        var popValue = member.GetValue(maValue, null);
                                        if (popValue == null)
                                        {
                                            popValue = DBNull.Value;
                                        }
                                        var binding = Expression.Bind(member, Expression.Constant(popValue));
                                        memberList.Add(binding);
                                    }
                                }
                                //mbeCst.Value
                                var myMem = Expression.MemberInit(Expression.New(mbeType), memberList.ToArray());
                                result = ExpressionInsertRouter <T>(dataSource, myMem, away, ref index, ref newID, ref paramerList, generater);
                            }
                        }
                        else
                        {
                            result = ExpressionInsertRouter <T>(dataSource, GetReduceOrConstant(mbe), away, ref index, ref newID, ref paramerList, generater);
                        }
                    }
                }
            }
            else if (exp is UnaryExpression)
            {
                if (away == DirAway.Right)
                {
                    result = ExpressionInsertRouter <T>(dataSource, GetReduceOrConstant(exp), away, ref index, ref newID, ref paramerList, generater);
                }
                else
                {
                    var uny = (UnaryExpression)exp;
                    result = ExpressionInsertRouter <T>(dataSource, uny.Operand, away, ref index, ref newID, ref paramerList, generater);
                }
            }
            else if (exp is ConstantExpression)
            {
                var paramName = dataSource.DbProvider.ParameterPrefix + "ist_param_" + index;
                var ce        = (ConstantExpression)exp;

                if (ce.Value == null || ce.Value is DBNull)
                {
                    paramerList.Add(dataSource.CreateParameter(paramName, DBNull.Value));
                    //return result;
                }
                else if (ce.Value is ValueType)
                {
                    paramerList.Add(dataSource.CreateParameter(paramName, ce.Value));
                    //return result;
                }
                else if (ce.Value is string || ce.Value is DateTime || ce.Value is char)
                {
                    paramerList.Add(dataSource.CreateParameter(paramName, ce.Value));
                }
                else
                {
                    paramerList.Add(dataSource.CreateParameter(paramName, ce.Value));
                }

                result.Append(paramName);
                index++;
            }
            else
            {
                result = ExpressionInsertRouter <T>(dataSource, GetReduceOrConstant(exp), away, ref index, ref newID, ref paramerList, generater);
            }
            return(result);
        }
示例#3
0
    static StringBuilder ExpressionRouter(this IDataSource dataSource, Expression exp, DirAway away, ref int index, ref List <DbParameter> paramerList, bool isFunc = false)
    {
        var sb = new StringBuilder();

        if (exp is BinaryExpression be)
        {
            sb = BinarExpressionProvider(dataSource, be.Left, be.Right, be.NodeType, ref index, ref paramerList);
        }
        else if (exp is MemberExpression me)
        {
            if (away == DirAway.Left)
            {
                sb.AppendFormat(dataSource.DbFactory.DbProvider.FieldFormat, me.Member.GetFieldName());
            }
            else
            {
                //把member的值读出来
                sb = ExpressionRouter(dataSource, GetReduceOrConstant(me), away, ref index, ref paramerList, isFunc);
            }
        }
        else if (exp is NewArrayExpression ae)
        {
            if (isFunc)
            {
                var tmpstr = new StringBuilder();
                foreach (var ex in ae.Expressions)
                {
                    tmpstr.Append(ExpressionRouter(dataSource, ex, DirAway.Left, ref index, ref paramerList));
                    tmpstr.Append(',');
                }

                if (tmpstr.Length > 0)
                {
                    tmpstr.Length -= 1;
                    var result = dataSource.DbFactory.DbProvider.ParameterPrefix + "fs_param_" + index;

                    sb.Append(result);
                    paramerList.Add(dataSource.CreateParameter(result, tmpstr.ToString()));
                    index++;
                }
            }
            else
            {
                var tmpstr     = new StringBuilder();
                var arrayIndex = 0;
                foreach (var ex in ae.Expressions)
                {
                    var result = string.Concat(dataSource.DbFactory.DbProvider.ParameterPrefix, "arr_param_", index, "_" + arrayIndex);
                    var value  = ExpressionRouter(dataSource, ex, DirAway.Left, ref index, ref paramerList);

                    paramerList.Add(dataSource.CreateParameter(result, value.ToString()));

                    tmpstr.Append(result);
                    tmpstr.Append(',');

                    arrayIndex++;
                }

                if (tmpstr.Length > 0)
                {
                    tmpstr.Length -= 1;
                    sb.Append(tmpstr);
                    index++;
                }
            }
        }
        else if (exp is MethodCallExpression mce)
        {
            if (mce.Method.Name == nameof(Core.ConditionExtensions.Like))
            {
                sb.AppendFormat("({0} LIKE {1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
            }
            else if (mce.Method.Name == nameof(Core.ConditionExtensions.NotLike))
            {
                sb.AppendFormat("({0} NOT LIKE {1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
            }
            else if (mce.Method.Name == nameof(Core.ConditionExtensions.Less))
            {
                sb.AppendFormat("({0} < {1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
            }
            else if (mce.Method.Name == nameof(Core.ConditionExtensions.LessEqual))
            {
                sb.AppendFormat("({0} <= {1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
            }
            else if (mce.Method.Name == nameof(Core.ConditionExtensions.Greater))
            {
                sb.AppendFormat("({0} > {1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
            }
            else if (mce.Method.Name == nameof(Core.ConditionExtensions.GreaterEqual))
            {
                sb.AppendFormat("({0} >= {1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
            }
            else if (mce.Method.Name == nameof(Core.ConditionExtensions.In))
            {
                sb.AppendFormat("{0} IN ({1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
            }
            else if (mce.Method.Name == nameof(Core.ConditionExtensions.NotIn))
            {
                sb.AppendFormat("{0} NOT IN ({1})", ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList), ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList));
            }
            //else if (mce.Method.Name == "Contains")
            //{
            //    if (mce.Object != null)
            //    {
            //        return Like(MethodCall);
            //    }
            //    return In(mce, value);
            //}
            else if (mce.Method.Name == nameof(Core.ConditionExtensions.InFunc))
            {
                var leftString  = ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList);
                var rightString = ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList, true);

                var infunc = dataSource.PagerGenerator.GetInFunc(() =>
                {
                    return(leftString);
                }, () =>
                {
                    return(rightString);
                });

                sb.Append(infunc);
            }
            else if (mce.Method.Name == nameof(Core.ConditionExtensions.NotInFunc))
            {
                var leftString  = ExpressionRouter(dataSource, mce.Arguments[0], DirAway.Left, ref index, ref paramerList);
                var rightString = ExpressionRouter(dataSource, mce.Arguments[1], DirAway.Right, ref index, ref paramerList, true);

                var infunc = dataSource.PagerGenerator.GetNotInFunc(() =>
                {
                    return(leftString);
                }, () =>
                {
                    return(rightString);
                });

                sb.Append(infunc);
            }
            else if (away == DirAway.Right)
            {
                sb.Append(ExpressionRouter(dataSource, GetReduceOrConstant(mce), away, ref index, ref paramerList, isFunc));
            }
        }
        else if (exp is ConstantExpression ce)
        {
            if (away == DirAway.Right)
            {
                if (ce.Value is Array arrayData)
                {
                    var list = new List <Expression>();
                    foreach (var item in arrayData)
                    {
                        list.Add(Expression.Constant(item));
                    }

                    sb.Append(ExpressionRouter(dataSource, Expression.NewArrayInit(arrayData.GetValue(0) !.GetType(), list), away, ref index, ref paramerList, isFunc));
                }
                else
                {
                    var result = dataSource.DbFactory.DbProvider.ParameterPrefix + "wh_param_" + index;
                    sb.Append(result);
                    if (ce.Value == null || ce.Value is DBNull)
                    {
                        paramerList.Add(dataSource.CreateParameter(result, DBNull.Value));
                    }
                    else if (ce.Value is ValueType)
                    {
                        paramerList.Add(dataSource.CreateParameter(result, ce.Value));
                    }
                    else if (ce.Value is string || ce.Value is DateTime || ce.Value is char)
                    {
                        paramerList.Add(dataSource.CreateParameter(result, ce.Value));
                    }
                    index++;
                }
            }
            else
            {
                if (ce.Value == null)
                {
                    sb.Append("null");
                }
                else
                {
                    sb.Append(ce.Value);
                }
            }
        }
        else if (exp is UnaryExpression ue)
        {
            return(ExpressionRouter(dataSource, ue.Operand, away, ref index, ref paramerList, isFunc));
        }
        else
        {
            sb.Append(ExpressionRouter(dataSource, GetReduceOrConstant(exp), away, ref index, ref paramerList, isFunc));
        }

        return(sb);
    }
示例#4
0
        /// <summary>
        /// 更新语句生成
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="exp"></param>
        /// <param name="index"></param>
        /// <param name="paramerList"></param>
        /// <returns></returns>
        static StringBuilder ExpressionUpdateRouter <T>(this AbstractService dataSource, Expression exp, DirAway away, ref int index, ref List <DbParameter> paramerList)
        {
            var result = new StringBuilder();

            if (exp is MemberInitExpression)
            {
                var minit = (MemberInitExpression)exp;
                //var sb = new StringBuilder();
                foreach (var item in minit.Bindings)
                {
                    if (item is MemberAssignment)
                    {
                        var myItem = (MemberAssignment)item;

                        var isKey   = false;
                        var isAuto  = false;
                        var keyType = KeyType.SEQ;

                        var fieldName = myItem.Member.Name;

                        object[] oArr = myItem.Member.GetCustomAttributes(true);
                        for (int i = 0; i < oArr.Length; i++)
                        {
                            if (oArr[i] is DataFieldAttribute)
                            {
                                var df = (DataFieldAttribute)oArr[i];
                                fieldName = df.FieldName;
                                isKey     = df.IsKey;
                                isAuto    = df.IsAuto;
                                keyType   = df.KeyType;
                            }
                        }

                        if (isKey && isAuto && keyType == KeyType.SEQ)
                        {
                            continue;
                        }
                        else
                        {
                            result.Append(GetFieldName(myItem.Member));
                            result.Append(" = ");
                            result.Append(ExpressionUpdateRouter <T>(dataSource, myItem.Expression, DirAway.Right, ref index, ref paramerList));
                            result.Append(",");
                        }
                    }
                }
                if (result.Length > 0)
                {
                    result.Length = result.Length - 1;
                }
            }
            else if (exp is MemberExpression)
            {
                var mbe      = (MemberExpression)exp;
                var nodeType = mbe.NodeType;
                if (mbe.Member.MemberType == MemberTypes.Property)
                {
                    if (away == DirAway.Left)
                    {
                        result.Append(GetFieldName(mbe.Member));
                    }
                    else
                    {
                        result = ExpressionUpdateRouter <T>(dataSource, GetReduceOrConstant(mbe), away, ref index, ref paramerList);
                    }
                }
                else if (mbe.Member.MemberType == MemberTypes.Field)
                {
                    if (away == DirAway.Left)
                    {
                        T maValue = default(T);
                        try
                        {
                            maValue = (T)GetMemberExpressionValue(mbe);
                        }
                        catch (Exception)
                        {
                        }
                        if (maValue != null)
                        {
                            var memberList = new List <MemberBinding>();
                            var mbeType    = typeof(T);
                            foreach (var member in mbeType.GetProperties())
                            {
                                if (member.MemberType == MemberTypes.Property)
                                {
                                    var popValue = member.GetValue(maValue, null);
                                    if (popValue == null)
                                    {
                                        popValue = DBNull.Value;
                                    }
                                    var binding = Expression.Bind(member, Expression.Constant(popValue));
                                    memberList.Add(binding);
                                }
                            }

                            //mbeCst.Value
                            var myMem = Expression.MemberInit(Expression.New(mbeType), memberList.ToArray());
                            result = ExpressionUpdateRouter <T>(dataSource, myMem, away, ref index, ref paramerList);
                        }
                    }
                    else
                    {
                        result = ExpressionUpdateRouter <T>(dataSource, GetReduceOrConstant(mbe), away, ref index, ref paramerList);
                    }
                }
            }
            else if (exp is UnaryExpression)
            {
                var uny = (UnaryExpression)exp;
                result = ExpressionUpdateRouter <T>(dataSource, uny.Operand, away, ref index, ref paramerList);
            }
            else if (exp is ConstantExpression)
            {
                var paramName = dataSource.DbProvider.ParameterPrefix + "ud_param_" + index;
                var ce        = (ConstantExpression)exp;

                if (ce.Value == null || ce.Value is DBNull)
                {
                    paramerList.Add(dataSource.CreateParameter(paramName, DBNull.Value));
                }
                else if (ce.Value is ValueType)
                {
                    paramerList.Add(dataSource.CreateParameter(paramName, ce.Value));
                }
                else if (ce.Value is string || ce.Value is DateTime || ce.Value is char)
                {
                    paramerList.Add(dataSource.CreateParameter(paramName, ce.Value));
                }
                else
                {
                    paramerList.Add(dataSource.CreateParameter(paramName, ce.Value));
                }

                result.Append(paramName);
                index++;
            }
            else
            {
                result = ExpressionUpdateRouter <T>(dataSource, GetReduceOrConstant(exp), away, ref index, ref paramerList);
            }

            return(result);
        }
示例#5
0
    /// <summary>
    /// 更新语句生成
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="exp"></param>
    /// <param name="index"></param>
    /// <param name="paramerList"></param>
    /// <returns></returns>
    static StringBuilder ExpressionUpdateRouter <T>(this IDataSource dataSource, Expression exp, DirAway away, ref int index, ref List <DbParameter> paramerList)
    {
        var result = new StringBuilder();

        if (exp is MemberInitExpression minit)
        {
            //var sb = new StringBuilder();
            foreach (var item in minit.Bindings)
            {
                if (item is MemberAssignment myItem)
                {
                    var isKey   = false;
                    var isAuto  = false;
                    var keyType = KeyType.SEQ;

                    var fieldName = myItem.Member.Name;
                    var df        = myItem.Member.GetCustomAttribute <DataFieldAttribute>(true);
                    if (df != null)
                    {
                        fieldName = df.FieldName;
                        isKey     = df.IsKey;
                        isAuto    = df.IsAuto;
                        keyType   = df.KeyType;
                    }

                    if (isKey && isAuto && keyType == KeyType.SEQ)
                    {
                        continue;
                    }
                    else
                    {
                        //result.AppendFormat(dataSource.DbFactory.DbProvider.FieldFormat, myItem.Member.GetFieldName());
                        //result.Append(" = ");
                        //result.Append(ExpressionUpdateRouter<T>(dataSource,myItem.Expression, DirAway.Right, ref index, ref paramerList));
                        //result.Append(',');

                        var fieldNameKey = string.Format(dataSource.DbFactory.DbProvider.FieldFormat, myItem.Member.GetFieldName());
                        result.Append(fieldNameKey);

                        //识别自方法体,做自增,自减,自乘,自除, 自取模
                        var dynamicExpression = myItem.Expression as MethodCallExpression;
                        if (dynamicExpression != null)
                        {
                            switch (dynamicExpression.Method.Name)
                            {
                            case nameof(ConditionExtensions.AddEqual):
                                result.Append(" = ");
                                result.Append(fieldNameKey);
                                result.Append(" + ");
                                break;

                            case nameof(ConditionExtensions.SubEqual):
                                result.Append(" = ");
                                result.Append(fieldNameKey);
                                result.Append(" - ");
                                break;

                            case nameof(ConditionExtensions.MultiEqual):
                                result.Append(" = ");
                                result.Append(fieldNameKey);
                                result.Append(" * ");
                                break;

                            case nameof(ConditionExtensions.DivEqual):
                                result.Append(" = ");
                                result.Append(fieldNameKey);
                                result.Append(" / ");
                                break;

                            case nameof(ConditionExtensions.ModEqual):
                                result.Append(" = ");
                                result.Append(fieldNameKey);
                                result.Append(" % ");
                                break;

                            default:
                                result.Append(" = ");
                                break;
                            }
                        }
                        else
                        {
                            result.Append(" = ");
                        }

                        result.Append(ExpressionUpdateRouter <T>(dataSource, myItem.Expression, DirAway.Right, ref index, ref paramerList));
                        result.Append(',');
                    }
                }
            }
            if (result.Length > 0)
            {
                result.Length -= 1;
            }
        }
        else if (exp is MemberExpression mbe)
        {
            if (mbe.Member.MemberType == MemberTypes.Property)
            {
                if (away == DirAway.Left)
                {
                    result.AppendFormat(dataSource.DbFactory.DbProvider.FieldFormat, mbe.Member.GetFieldName());
                }
                else
                {
                    result = ExpressionUpdateRouter <T>(dataSource, GetReduceOrConstant(mbe), away, ref index, ref paramerList);
                }
            }
            else if (mbe.Member.MemberType == MemberTypes.Field)
            {
                if (away == DirAway.Left)
                {
                    T maValue = default !;