예제 #1
0
        public static Sql Delete <TModel>(Expression <Func <TModel, bool> > exp) where TModel : class, new()
        {
            Sql    sql       = new Sql();
            string tableName = typeof(TModel).Name;

            StringBuilder text = new StringBuilder();

            text.Append($"DELETE {tableName}");
            if (exp != null)
            {
                text.Append("WHERE ");
                string whereStr = SqlBuilderExpression.ResolveExpression(exp);
                if (string.IsNullOrEmpty(whereStr))
                {
                    throw new ArgumentNullException($"解析{nameof(exp)} 出错");
                }

                text.Append(whereStr);
                sql.Where      = whereStr;
                sql.TableNames = new List <string>()
                {
                    tableName
                };
                sql.Commandtext = text.ToString();
            }
            return(sql);
        }
예제 #2
0
        //多表
        private static Sql Find(Expression exp)
        {
            Sql           sql  = new Sql();
            StringBuilder text = new StringBuilder();

            text.AppendLine("SELECT ");
            if (exp == null)
            {
                throw new Exception(nameof(exp));
            }
            List <string> tableNames = new List <string>();

            if (exp is LambdaExpression)
            {
                LambdaExpression lambdaExpression = exp as LambdaExpression;

                List <ParameterExpression> parameterExpressions = lambdaExpression.Parameters.ToList();
                if (parameterExpressions == null)
                {
                    throw new Exception(nameof(parameterExpressions));
                }
                var index = 0;
                foreach (var parameterExpression in parameterExpressions)
                {
                    if (index == parameterExpressions.Count - 1)
                    {
                        text.AppendLine($"{parameterExpression.Type.Name}.* ");
                    }
                    else
                    {
                        text.AppendLine($"{parameterExpression.Type.Name}.*, ");
                    }
                    index++;
                    sql.ColumnNames.Add($"{parameterExpression.Type.Name}.*, ");
                }
                text.AppendLine($"FROM   [{parameterExpressions.FirstOrDefault().Type.Name }] AS   {parameterExpressions.FirstOrDefault().Type.Name }");
                sql.TableNames.Add(parameterExpressions.FirstOrDefault().Type.Name);
                //条件
                string        on              = SqlBuilderExpression.ResolveExpression(exp, isAppendTalbeName: true);
                List <string> onSplits        = on.Split(new string[] { "\r\n" }, StringSplitOptions.None)?.ToList();
                var           talbleNameIndex = 1;
                for (int i = 0; i < onSplits.Count; i++)
                {
                    if (onSplits[i].Equals(JoinType.InnerJoin) || onSplits[i].Equals(JoinType.LeftJoin))
                    {
                        onSplits[i] = $"{onSplits[i]}  {parameterExpressions[talbleNameIndex].Type.Name} On";
                        sql.TableNames.Add(parameterExpressions[talbleNameIndex].Type.Name);
                        talbleNameIndex++;
                    }
                }
                text.AppendLine(string.Join(" ", onSplits));
                sql.Commandtext = text.ToString();
                return(sql);
            }
            else
            {
                throw new Exception("不是 LambdaExpression表达式,无法解析");
            }
        }
예제 #3
0
        public static Sql Update <TModel>(TModel model, Expression <Func <TModel, bool> > exp) where TModel : class, new()
        {
            Sql           sql       = new Sql();
            string        tableName = model.GetType().Name;
            var           ps        = model.GetType().GetProperties();
            StringBuilder text      = new StringBuilder();

            text.Append($"UPDATE {tableName} SET ");


            foreach (var p in ps)
            {
                //跳过主健
                if (p.PropertyType.Name.Equals("Id", StringComparison.OrdinalIgnoreCase))
                {
                    continue;
                }
                if (p.PropertyType.IsArray)
                {
                    continue;
                }
                if (p.PropertyType.IsGenericType)
                {
                    continue;
                }
                if (p.PropertyType.IsGenericTypeDefinition)
                {
                    var objValue   = ReflectionHelper.ChangeValue(p, p.GetValue(model));
                    var colunmName = p.PropertyType.GetGenericArguments().FirstOrDefault().Name;
                    sql.ColumnNames.Add(colunmName);
                    text.Append($"[{colunmName}] = {objValue}");
                }
                else
                {
                    var objValue   = ReflectionHelper.ChangeValue(p, p.GetValue(model));
                    var colunmName = p.Name;
                    text.Append($"[{colunmName}] = {objValue}");
                }
            }
            if (exp != null)
            {
                text.Append("WHERE ");
                string whereStr = SqlBuilderExpression.ResolveExpression(exp);
                if (string.IsNullOrEmpty(whereStr))
                {
                    throw new ArgumentNullException($"解析{nameof(exp)} 出错");
                }

                text.Append(whereStr);
                sql.Where      = whereStr;
                sql.TableNames = new List <string>()
                {
                    tableName
                };
                sql.Commandtext = text.ToString();
            }
            return(sql);
        }
예제 #4
0
 public QueryExpression <TModel> Or(Expression <Func <TModel, bool> > exp)
 {
     if (StringWhere.ToString().Substring(0, @where.Length) != where)
     {
         throw new Exception($"调用Add之前先调用 {nameof(True)} 方法 ");
     }
     StringWhere.AppendLine($" Or  {SqlBuilderExpression.ResolveExpression(exp, isAppendTalbeName: true)}");
     return(this);
 }
예제 #5
0
        public static Sql GetMin <TModel, TColunmType>(Expression <Func <TModel, TColunmType> > exp) where TModel : class, new()
        {
            Sql    sql       = new Sql();
            string tableName = typeof(TModel).Name;

            if (exp == null)
            {
                throw new ArgumentNullException(nameof(exp));
            }
            string        maxColumnName = SqlBuilderExpression.ResolveExpression(exp);
            StringBuilder text          = new StringBuilder();

            text.AppendLine($"SELECT Min({maxColumnName}) FROM [{tableName}] ");
            sql.Commandtext = text.ToString();
            return(sql);
        }
예제 #6
0
        /// <summary>
        /// 一表,视图
        /// </summary>
        /// <typeparam name="TModel"></typeparam>
        /// <param name="exp"></param>
        /// <returns></returns>
        public static Sql GetList <TModel>(Expression <Func <TModel, bool> > exp) where TModel : class, new()
        {
            Sql           sql       = new Sql();
            var           selectSql = Find <TModel>(1);
            StringBuilder text      = new StringBuilder();

            text.AppendLine(selectSql);
            if (exp == null)
            {
                throw new ArgumentNullException($"{nameof(exp)} ");
            }
            StringBuilder where = new StringBuilder();
            where.AppendLine("WHERE 1= 1");
            where.AppendLine(SqlBuilderExpression.ResolveExpression(exp));
            if (string.IsNullOrEmpty(where.ToString()))
            {
                throw new ArgumentNullException($"解析{nameof(exp)} 出错");
            }
            text.AppendLine(where.ToString());
            sql.Commandtext = text.ToString();
            sql.Where       = where.ToString();
            return(sql);
        }