private UpdateDefinition <T> GetUpdateFiled <T>(T item, Expression <Func <T, object> > field)
        {
            try
            {
                var pInfo     = PropertyCache.GetPropertyInfo <T>();
                var dynGet    = new DynamicGet <T>();
                var fieldList = new List <UpdateDefinition <T> >();

                var list = (field.Body as NewExpression).Members;
                foreach (var temp in list)
                {
                    var itemValue = dynGet.GetValue(item, temp.Name);
                    fieldList.Add(Builders <T> .Update.Set(temp.Name, itemValue));
                }

                return(Builders <T> .Update.Combine(fieldList));
            }
            catch (Exception ex)
            {
                Task.Run(() =>
                {
                    SaveLog <T>(ex, "UpdateDefinition<T>");
                }).ConfigureAwait(false);
                return(null);
            }
        }
예제 #2
0
        /// <summary>
        ///  to list
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dr"></param>
        /// <param name="dbType"></param>
        /// <returns></returns>
        public static List <T> ToList <T>(DbDataReader dr, ConfigModel config, List <string> field = null) where T : class, new()
        {
            var list    = new List <T>();
            var colList = new List <string>();

            if (dr == null)
            {
                return(list);
            }

            if (dr.HasRows)
            {
                colList = GetCol(dr);
            }

            var propertyList = PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache);

            while (dr.Read())
            {
                var item = new T();

                if (field == null || field.Count == 0)
                {
                    foreach (var info in propertyList)
                    {
                        if (!colList.Exists(a => string.Compare(a, info.Name, true) == 0))
                        {
                            continue;
                        }

                        if (info.PropertyType.IsGenericType && info.PropertyType.GetGenericTypeDefinition() != typeof(Nullable <>))
                        {
                            continue;
                        }

                        item = SetValue <T>(item, dr, info, config);
                    }
                }
                else
                {
                    for (var i = 0; i < field.Count; i++)
                    {
                        if (!colList.Exists(a => string.Compare(a, field[i], true) == 0))
                        {
                            continue;
                        }

                        if (propertyList.Exists(a => string.Compare(a.Name, field[i], true) == 0))
                        {
                            var info = propertyList.Find(a => string.Compare(a.Name, field[i], true) == 0);
                            item = SetValue <T>(item, dr, info, config);
                        }
                    }
                }

                list.Add(item);
            }

            return(list);
        }
예제 #3
0
        /// <summary>
        /// 获取表结构
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="cmd"></param>
        /// <returns></returns>
        public static DataTable ToDataTable <T>(DbCommand cmd, ConfigModel config, List <string> where, Expression <Func <T, object> > field = null)
        {
            var dt  = new DataTable();
            var sql = new List <string>();

            if (field == null)
            {
                PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache).ForEach(a => { sql.Add(a.Name); });
            }
            else
            {
                (field.Body as NewExpression).Members.ToList().ForEach(a => { sql.Add(a.Name); });
            }

            where.ForEach(a => { sql.Add(a); });

            cmd.CommandText = string.Format("select {1} from {0} where 1=0", typeof(T).Name, string.Join(",", sql.ToArray()));

            var dr = cmd.ExecuteReader();

            dt.Load(dr);
            dr.Close();
            dr.Dispose();
            return(dt);
        }
예제 #4
0
        /// <summary>
        /// to model
        /// </summary>
        /// <param name="model"></param>
        /// <param name="dr"></param>
        /// <param name="config"></param>
        /// <param name="field"></param>
        /// <returns></returns>
        public static Object ToModel(Object model, DbDataReader dr, ConfigModel config, List <string> field = null)
        {
            var result  = Activator.CreateInstance(model.GetType());
            var colList = new List <string>();

            if (dr == null)
            {
                return(null);
            }

            if (dr.HasRows)
            {
                colList = GetCol(dr);
            }

            var propertyList = PropertyCache.GetPropertyInfo(model, config.IsPropertyCache);

            while (dr.Read())
            {
                if (field == null || field.Count == 0)
                {
                    foreach (var info in propertyList)
                    {
                        if (!colList.Exists(a => string.Compare(a, info.Name, true) == 0))
                        {
                            continue;
                        }

                        if (info.PropertyType.IsGenericType && info.PropertyType.GetGenericTypeDefinition() != typeof(Nullable <>))
                        {
                            continue;
                        }

                        result = SetValue(result, dr, info, config);
                    }
                }
                else
                {
                    for (var i = 0; i < field.Count; i++)
                    {
                        if (!colList.Exists(a => string.Compare(a, field[i], true) == 0))
                        {
                            continue;
                        }

                        if (propertyList.Exists(a => string.Compare(a.Name, field[i], true) == 0))
                        {
                            var info = propertyList.Find(a => string.Compare(a.Name, field[i], true) == 0);
                            result = SetValue(result, dr, info, config);
                        }
                    }
                }
            }

            return(result);
        }
예제 #5
0
        /// <summary>
        /// 获取datatabel
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="db"></param>
        /// <returns></returns>
        public static DataTable GetTable <T>(DbCommand cmd, List <T> list)
        {
            var dt = new DataTable();

            cmd.CommandText = string.Format("select top 1 * from {0}", typeof(T).Name);
            dt.Load(cmd.ExecuteReader());
            dt.Clear();
            list.ForEach(p => {
                var row = dt.NewRow();
                PropertyCache.GetPropertyInfo <T>().ForEach(a => { row[a.Name] = BaseEmit.Get <T>(p, a.Name); });
                dt.Rows.Add(row);
            });
            return(dt);
        }
예제 #6
0
        /// <summary>
        /// Creates the instance.
        /// </summary>
        /// <returns></returns>
        public object CreateInstance(IRuntimeType instance)
        {
            var obj          = Activator.CreateInstance(instance.ActivatorType);
            var runtimeTypes = instance.RuntimeTypes.ToArray();

            for (int i = 0; i < runtimeTypes.Length; i++)
            {
                var runtimeType  = runtimeTypes[i];
                var value        = runtimeType.GetValue(instance.Attribute, instance.Id);
                var propertyInfo = PropertyCache.GetPropertyInfo(runtimeType);
                propertyInfo.SetValue(obj, value);
            }
            return(obj);
        }
예제 #7
0
        /// <summary>
        /// model 转 insert sql
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="model">实体</param>
        /// <param name="sql">sql</param>
        /// <param name="oracleParam">参数</param>
        /// <returns></returns>
        public static OptionModel InsertToSql <T>(T model, ConfigModel config)
        {
            var sbName  = new StringBuilder();
            var sbValue = new StringBuilder();
            var list    = new List <MemberInfo>();
            var result  = new OptionModel();

            try
            {
                sbName.AppendFormat("insert into {0} (", typeof(T).Name);
                sbValue.Append(" values (");

                PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache).ForEach(p =>
                {
                    if (!list.Exists(a => a.Name == p.Name))
                    {
                        sbName.AppendFormat("{0},", p.Name);

                        sbValue.AppendFormat("{1}{0},", p.Name, config.Flag);

                        var itemValue      = BaseEmit.Get <T>(model, p.Name);
                        var temp           = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter();
                        temp.ParameterName = p.Name;
                        temp.Value         = itemValue == null ? DBNull.Value : itemValue;
                        result.Param.Add(temp);
                    }
                });

                result.Sql = string.Format("{0}) {1})", sbName.ToString().Substring(0, sbName.ToString().Length - 1)
                                           , sbValue.ToString().Substring(0, sbValue.ToString().Length - 1));
                result.IsSuccess = true;
                return(result);
            }
            catch (Exception ex)
            {
                if (string.Compare(config.SqlErrorType, SqlErrorType.Db, true) == 0)
                {
                    DbLogTable.LogException(config, ex, "InsertToSql<T>", result.Sql);
                }
                else
                {
                    DbLog.LogException(config.IsOutError, config.DbType, ex, "InsertToSql<T>", result.Sql);
                }

                result.IsSuccess = false;
                return(result);
            }
        }
예제 #8
0
        /// <summary>
        /// tvsps sql
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dyn"></param>
        /// <returns></returns>
        public static string GetTvps <T>()
        {
            var sql1 = new StringBuilder();
            var sql2 = new StringBuilder();

            sql1.AppendFormat("insert into {0} (", typeof(T).Name);
            sql2.Append("select ");
            PropertyCache.GetPropertyInfo <T>().ForEach(a => {
                sql1.AppendFormat("{0},", a.Name);
                sql2.AppendFormat("tb.{0},", a.Name);
            });
            sql1.Append(")");
            sql2.AppendFormat("from @{0} as tb", typeof(T).Name);

            return(string.Format("{0}{1}", sql1.ToString().Replace(",)", ") "), sql2.ToString().Replace(",from", " from")));
        }
예제 #9
0
        /// <summary>
        /// mysql
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <returns></returns>
        public static string GetMySql <T>(List <T> list)
        {
            var sql = new StringBuilder();

            sql.AppendFormat("insert into {0}(", typeof(T).Name);
            PropertyCache.GetPropertyInfo <T>().ForEach(a => { sql.AppendFormat("{0},", a.Name); });
            sql.Append(")").Replace(",)", ")");
            list.ForEach(a => {
                sql.Append("(");
                PropertyCache.GetPropertyInfo <T>().ForEach(p => {
                    sql.AppendFormat("'{0}',", BaseEmit.Get <T>(a, p.Name));
                });
                sql.Append("),").Replace(",)", ")");
            });

            return(sql.ToStr().Substring(0, sql.ToStr().Length - 1));
        }
예제 #10
0
        /// <summary>
        /// mysql
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public static string GetMySql(List <object> list)
        {
            var sql = new StringBuilder();

            sql.AppendFormat("insert into {0}(", list[0].GetType().Name);

            PropertyCache.GetPropertyInfo(list[0]).ForEach(a => { sql.AppendFormat("{0},", a.Name); });

            sql.Append(")").Replace(",)", ")");

            list.ForEach(a =>
            {
                sql.Append("(");
                PropertyCache.GetPropertyInfo(list[0]).ForEach(b => { sql.AppendFormat("'{0}',", BaseEmit.Get(a, b.Name)); });
                sql.Append("),").Replace(",)", ")");
            });

            return(sql.ToStr().Substring(0, sql.ToStr().Length - 1));
        }
예제 #11
0
        /// <summary>
        /// mysql
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="list"></param>
        /// <returns></returns>
        public static string GetMySql <T>(List <T> list)
        {
            var sql = new StringBuilder();

            sql.AppendFormat("insert into {0}(", typeof(T).Name);
            var dyn = new Property.DynamicGet <T>();

            PropertyCache.GetPropertyInfo <T>().ForEach(a => { sql.AppendFormat("{0},", a.Name); });

            sql.Append(")").Replace(",)", ")");

            list.ForEach(a => {
                sql.Append("(");
                PropertyCache.GetPropertyInfo <T>().ForEach(b => { sql.AppendFormat("'{0}',", dyn.GetValue(a, b.Name, true)); });
                sql.Append("),").Replace(",)", ")");
            });

            return(sql.ToStr().Substring(0, sql.ToStr().Length - 1));
        }
예제 #12
0
        /// <summary>
        /// 获取datatabel
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="db"></param>
        /// <returns></returns>
        public static DataTable GetTable(DbCommand cmd, List <object> list, System.Type type)
        {
            var dt = new DataTable();

            cmd.CommandText = string.Format("select top 1 * from {0}", type.Name);
            dt.Load(cmd.ExecuteReader());
            dt.Clear();

            list.ForEach(a =>
            {
                var row = dt.NewRow();
                PropertyCache.GetPropertyInfo(list[0]).ForEach(p =>
                {
                    row[p.Name] = BaseEmit.Get(a, p.Name);
                });
                dt.Rows.Add(row);
            });

            return(dt);
        }
예제 #13
0
        /// <summary>
        /// query field 2个表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="field"></param>
        /// <returns></returns>
        public static FieldModel QueryField <T, T1>(Expression <Func <T, T1, bool> > predicate, Expression <Func <T1, object> > field, DataQuery query)
        {
            try
            {
                var result      = new FieldModel();
                var queryFields = new List <string>();
                var asName      = "";

                if (field == null)
                {
                    var list = PropertyCache.GetPropertyInfo <T1>(query.Config.IsPropertyCache);
                    asName = query.TableAsName.GetValue(predicate.Parameters[1].Type.Name).ToString();
                    list.ForEach(a =>
                    {
                        queryFields.Add(string.Format("{0}.{1}", asName, a.Name));
                        result.AsName.Add(a.Name);
                    });

                    result.Field = string.Join(",", queryFields);
                    return(result);
                }

                var i = 0;
                asName = query.TableAsName.GetValue(predicate.Parameters[0].Type.Name).ToString();
                (field.Body as NewExpression).Arguments.ToList().ForEach(a =>
                {
                    if (a is MethodCallExpression)
                    {
                        var methodName   = "";
                        var ower         = "";
                        var propertyName = GetPropertyMethod(a, out methodName, true, out ower);

                        if (string.Compare(methodName, "distinct", true) == 0)
                        {
                            queryFields.Add(string.Format("{2}{0} {2}.{1}", methodName, propertyName, ower, asName));
                            result.AsName.Add((a as MemberExpression).Member.Name);
                        }
                        else if (string.Compare(methodName, "sum", true) == 0)
                        {
                            if (query.Config.DbType == DataDbType.SqlServer)
                            {
                                propertyName = string.Format("isnull({1}.{0},0)", propertyName, asName);
                            }

                            if (query.Config.DbType == DataDbType.MySql || query.Config.DbType == DataDbType.SQLite)
                            {
                                propertyName = string.Format("ifnull({1}.{0},0)", propertyName, asName);
                            }

                            if (query.Config.DbType == DataDbType.Oracle)
                            {
                                propertyName = string.Format("nvl({1}.{0},0)", propertyName, asName);
                            }

                            if (query.Config.DbType == DataDbType.DB2)
                            {
                                propertyName = string.Format("coalesce({1}.{0},0)", propertyName, asName);
                            }

                            queryFields.Add(string.Format("{0}({2}.{1})", methodName, propertyName, asName));
                            result.AsName.Add((field.Body as NewExpression).Members[i].Name);
                        }
                        else
                        {
                            queryFields.Add(string.Format("{2}{0}({3}.{1})", methodName, propertyName, ower, asName));
                            result.AsName.Add((field.Body as NewExpression).Members[i].Name);
                        }
                    }
                    else
                    {
                        if (a is MemberExpression)
                        {
                            var express = (a as MemberExpression).Expression;
                            asName      = query.TableAsName.GetValue(express.Type.Name).ToString();
                            queryFields.Add(string.Format("{0}.{1}", asName, (a as MemberExpression).Member.Name));
                            result.AsName.Add((a as MemberExpression).Member.Name);
                        }
                    }
                    i++;
                });


                result.Field = string.Join(",", queryFields);
                return(result);
            }
            catch (Exception ex)
            {
                if (query.Config.SqlErrorType == SqlErrorType.Db)
                {
                    DbLogTable.LogException <T>(query.Config, ex, "QueryField<T1,T2,T>", "");
                }
                else
                {
                    DbLog.LogException(query.Config.IsOutError, query.Config.DbType, ex, "QueryField<T1,T2,T>", "");
                }

                return(new FieldModel {
                    Field = "*"
                });
            }
        }
예제 #14
0
        /// <summary>
        /// model 转 update list sql
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="model">实体</param>
        /// <param name="sql">sql</param>
        /// <param name="oracleParam">参数</param>
        /// <returns></returns>
        public static OptionModel UpdateListToSql <T>(DbCommand cmd, List <T> list, ConfigModel config, Expression <Func <T, object> > field = null)
        {
            var result = new OptionModel();

            result.IsCache = config.IsPropertyCache;
            var where      = PrimaryKey(config, cmd, typeof(T));

            if (where.Count == 0)
            {
                result.Message   = string.Format("{0}没有主键", typeof(T).Name);
                result.IsSuccess = false;
                return(result);
            }

            try
            {
                result.table = BaseExecute.ToDataTable <T>(cmd, config, where, field);

                result.Sql = string.Format("update {0} set", typeof(T).Name);
                var pInfo = PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache);

                if (field == null)
                {
                    #region 属性
                    foreach (var item in pInfo)
                    {
                        if (where.Exists(a => a == item.Name))
                        {
                            continue;
                        }
                        result.Sql = string.Format("{2} {0}={1}{0},", item.Name, config.Flag, result.Sql);
                        var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter();
                        temp.ParameterName = item.Name;
                        temp.SourceColumn  = item.Name;
                        result.Param.Add(temp);
                    }
                    #endregion
                }
                else
                {
                    #region lambda
                    foreach (var item in (field.Body as NewExpression).Members)
                    {
                        if (where.Exists(a => a == item.Name))
                        {
                            continue;
                        }
                        result.Sql = string.Format("{2} {0}={1}{0},", item.Name, config.Flag, result.Sql);
                        var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter();
                        temp.ParameterName = item.Name;
                        temp.SourceColumn  = item.Name;
                        result.Param.Add(temp);
                    }
                    #endregion
                }

                result.Sql = result.Sql.Substring(0, result.Sql.Length - 1);

                var count = 1;
                where.ForEach(a =>
                {
                    if (count == 1)
                    {
                        result.Sql = string.Format("{2} where {0}={1}{0} ", a, config.Flag, result.Sql);
                    }
                    else
                    {
                        result.Sql = string.Format("{2} and {0}={1}{0} ", a, config.Flag, result.Sql);
                    }

                    var temp           = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter();
                    temp.ParameterName = a;
                    temp.SourceColumn  = a;
                    result.Param.Add(temp);
                    count++;
                });

                result.IsSuccess = true;

                list.ForEach(p =>
                {
                    var row = result.table.NewRow();
                    where.ForEach(a => { row[a] = BaseEmit.Get <T>(p, a); });
                    if (field == null)
                    {
                        PropertyCache.GetPropertyInfo <T>().ForEach(a => { row[a.Name] = BaseEmit.Get <T>(p, a.Name); });
                    }
                    else
                    {
                        (field.Body as NewExpression).Members.ToList().ForEach(a => { row[a.Name] = BaseEmit.Get <T>(p, a.Name); });
                    }
                    result.table.Rows.Add(row);
                });

                return(result);
            }
            catch (Exception ex)
            {
                if (config.SqlErrorType == SqlErrorType.Db)
                {
                    DbLogTable.LogException <T>(config, ex, "UpdateListToSql<T>", result.Sql);
                }
                else
                {
                    DbLog.LogException <T>(config.IsOutError, config.DbType, ex, "UpdateListToSql<T>", result.Sql);
                }

                result.IsSuccess = false;
                return(result);
            }
        }
예제 #15
0
        /// <summary>
        /// model 转 update sql
        /// </summary>
        /// <param name="cmd"></param>
        /// <param name="model"></param>
        /// <param name="config"></param>
        /// <returns></returns>
        public static OptionModel UpdateToSql(DbCommand cmd, object model, ConfigModel config)
        {
            var result = new OptionModel();

            result.IsCache = config.IsPropertyCache;
            var where      = PrimaryKey(config, cmd, model.GetType());

            if (where.Count == 0)
            {
                result.Message   = string.Format("{0}没有主键", model.GetType().Name);
                result.IsSuccess = false;
                return(result);
            }

            try
            {
                result.Sql = string.Format("update {0} set", model.GetType().Name);
                var pInfo = PropertyCache.GetPropertyInfo(model, config.IsPropertyCache);

                foreach (var item in pInfo)
                {
                    if (where.Exists(a => a == item.Name))
                    {
                        continue;
                    }

                    result.Sql = string.Format("{2} {0}={1}{0},", item.Name, config.Flag, result.Sql);

                    var itemValue = BaseEmit.Get(model, item.Name);
                    var temp      = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter();
                    temp.ParameterName = item.Name;
                    temp.Value         = itemValue == null ? DBNull.Value : itemValue;
                    result.Param.Add(temp);
                }

                result.Sql = result.Sql.Substring(0, result.Sql.Length - 1);

                var count = 1;
                foreach (var item in where)
                {
                    var itemValue = BaseEmit.Get(model, item);

                    if (itemValue == null)
                    {
                        result.IsSuccess = false;
                        result.Message   = string.Format("主键{0}值为空", item);
                        return(result);
                    }

                    if (count == 1)
                    {
                        result.Sql = string.Format("{2} where {0}={1}{0} ", item, config.Flag, result.Sql);
                    }
                    else
                    {
                        result.Sql = string.Format("{2} and {0}={1}{0} ", item, config.Flag, result.Sql);
                    }

                    var temp = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter();
                    temp.ParameterName = item;
                    temp.Value         = itemValue == null ? DBNull.Value : itemValue;

                    result.Param.Add(temp);

                    count++;
                }

                result.IsSuccess = true;

                return(result);
            }
            catch (Exception ex)
            {
                if (config.SqlErrorType == SqlErrorType.Db)
                {
                    DbLogTable.LogException(config, ex, "UpdateToSql", result.Sql);
                }
                else
                {
                    DbLog.LogException(config.IsOutError, config.DbType, ex, "UpdateToSql", result.Sql);
                }
                result.IsSuccess = false;
                return(result);
            }
        }
예제 #16
0
        /// <summary>
        /// 服务参数
        /// </summary>
        /// <param name="info"></param>
        /// <param name="model"></param>
        private static void ServiceParam(MethodInfo info, ServiceModel model, ConfigModel config)
        {
            if (info.ReturnType != typeof(WriteReturn) && model.isWrite)
            {
                throw new Exception($"[return type only WriteReturn, service:{info.DeclaringType.Name}, method:{info.Name}, return type:{info.ReturnType} is not support]");
            }

            if (string.IsNullOrEmpty(model.dbKey))
            {
                throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, dbkey is not null]");
            }

            if (info.ReturnType.isSysType())
            {
                throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, return type:{info.ReturnType} is not support]");
            }

            if (string.IsNullOrEmpty(model.sql) && !model.isXml)
            {
                throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, sql is not null]");
            }

            if (model.isPage && !info.GetParameters().ToList().Exists(a => a.ParameterType == typeof(PageModel)))
            {
                throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, read data by page , parameter type:{typeof(PageModel).FullName} not exists]");
            }

            if (info.GetParameters().Length == 1 && info.GetParameters()[0].ParameterType.IsGenericType)
            {
                throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, parameter type:{info.GetParameters()[0].ParameterType} is not support]");
            }

            if (model.isPage && info.ReturnType.GetGenericArguments().Length > 0 && info.ReturnType == typeof(PageResult <>).MakeGenericType(new System.Type[] { info.ReturnType.GetGenericArguments()[0] }))
            {
                model.type = info.ReturnType.GetGenericArguments()[0];
            }
            else if (model.isPage && info.ReturnType == typeof(PageResult))
            {
                model.type = null;
            }
            else if (model.isPage)
            {
                throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, read data by page , return type:{info.ReturnType} is not support]");
            }

            if (info.ReturnType == typeof(Dictionary <string, object>) && (!model.isWrite || model.isXml))
            {
                model.isList = false;
            }
            else if (info.ReturnType == typeof(List <Dictionary <string, object> >) && (!model.isWrite || model.isXml))
            {
                model.isList = true;
            }
            else if (!model.isWrite || model.isXml)
            {
                model.isList = info.ReturnType.GetGenericArguments().Length > 0;
                System.Type argType;

                if (model.isList)
                {
                    argType = info.ReturnType.GetGenericArguments()[0];
                }
                else
                {
                    argType = info.ReturnType;
                }

                if (argType.isSysType())
                {
                    throw new Exception($"[service:{info.DeclaringType.Name}, method:{info.Name}, return type:{info.ReturnType} is not support]");
                }
            }

            var dic = new Dictionary <int, string>();

            if (info.GetParameters().ToList().Exists(a => a.ParameterType == typeof(Dictionary <string, object>)))
            {
                model.isDic = true;
            }
            else if (!info.GetParameters().ToList().Exists(a => a.ParameterType.isSysType()))
            {
                var type = info.GetParameters().ToList().Find(a => a.ParameterType != typeof(PageModel)).ParameterType;
                var pro  = PropertyCache.GetPropertyInfo(Activator.CreateInstance(type));
                pro.ForEach(a =>
                {
                    var key = string.Format("{0}{1}", config.Flag, a.Name).ToLower();
                    if (!model.isXml && model.sql.IndexOf(key) > 0)
                    {
                        dic.Add(model.sql.IndexOf(key), a.Name);
                    }
                });
            }
            else
            {
                for (int i = 0; i < info.GetParameters().Length; i++)
                {
                    var key = string.Format("{0}{1}", config.Flag, info.GetParameters()[i].Name).ToLower();
                    if (!model.isXml && model.sql.IndexOf(key) > 0)
                    {
                        dic.Add(model.sql.IndexOf(key), info.GetParameters()[i].Name.ToLower());
                    }
                }
                model.isSysType = true;
            }

            var list = dic.OrderBy(d => d.Key).ToList();

            for (int i = 0; i < list.Count; i++)
            {
                model.param.Add(i.ToString(), dic[list[i].Key]);
            }
        }
예제 #17
0
        /// <summary>
        /// model 转 update sql
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="model">实体</param>
        /// <param name="sql">sql</param>
        /// <param name="oracleParam">参数</param>
        /// <returns></returns>
        public static OptionModel UpdateToSql <T>(DbCommand cmd, T model, ConfigModel config, Expression <Func <T, object> > field = null)
        {
            var result = new OptionModel();

            result.IsCache = config.IsPropertyCache;
            var where      = PrimaryKey(config, cmd, typeof(T));

            if (where.Count == 0)
            {
                result.Message   = string.Format("{0}没有主键", typeof(T).Name);
                result.IsSuccess = false;
                return(result);
            }

            try
            {
                result.Sql = string.Format("update {0} set", typeof(T).Name);
                var pInfo = PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache);

                if (field == null)
                {
                    #region 属性
                    foreach (var item in pInfo)
                    {
                        if (where.Exists(a => a == item.Name))
                        {
                            continue;
                        }

                        result.Sql = string.Format("{2} {0}={1}{0},", item.Name, config.Flag, result.Sql);

                        var itemValue = BaseEmit.Get <T>(model, item.Name);
                        var temp      = DbProviderFactories.GetFactory(config).CreateParameter();
                        temp.ParameterName = item.Name;
                        temp.Value         = itemValue == null ? DBNull.Value : itemValue;
                        result.Param.Add(temp);
                    }
                    #endregion
                }
                else
                {
                    #region lambda
                    var list = (field.Body as NewExpression).Members;
                    foreach (var item in list)
                    {
                        if (where.Exists(a => a == item.Name))
                        {
                            continue;
                        }

                        result.Sql = string.Format("{2} {0}={1}{0},", item.Name, config.Flag, result.Sql);

                        var itemValue = BaseEmit.Get <T>(model, item.Name);
                        var temp      = DbProviderFactories.GetFactory(config).CreateParameter();
                        temp.ParameterName = item.Name;
                        temp.Value         = itemValue == null ? DBNull.Value : itemValue;
                        result.Param.Add(temp);
                    }
                    #endregion
                }

                result.Sql = result.Sql.Substring(0, result.Sql.Length - 1);

                var count = 1;
                foreach (var item in where)
                {
                    var itemValue = BaseEmit.Get <T>(model, item);

                    if (itemValue == null)
                    {
                        result.IsSuccess = false;
                        result.Message   = string.Format("主键{0}值为空", item);
                        return(result);
                    }

                    if (count == 1)
                    {
                        result.Sql = string.Format("{2} where {0}={1}{0} ", item, config.Flag, result.Sql);
                    }
                    else
                    {
                        result.Sql = string.Format("{2} and {0}={1}{0} ", item, config.Flag, result.Sql);
                    }

                    var temp = DbProviderFactories.GetFactory(config).CreateParameter();
                    temp.ParameterName = item;
                    temp.Value         = itemValue == null ? DBNull.Value : itemValue;

                    result.Param.Add(temp);

                    count++;
                }

                result.IsSuccess = true;

                return(result);
            }
            catch (Exception ex)
            {
                if (config.SqlErrorType == SqlErrorType.Db)
                {
                    DbLogTable.LogException <T>(config, ex, "UpdateToSql<T>", result.Sql);
                }
                else
                {
                    DbLog.LogException <T>(config.IsOutError, config.DbType, ex, "UpdateToSql<T>", result.Sql);
                }
                result.IsSuccess = false;
                return(result);
            }
        }
예제 #18
0
        /// <summary>
        /// model 转 update sql
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="model">实体</param>
        /// <param name="sql">sql</param>
        /// <param name="oracleParam">参数</param>
        /// <returns></returns>
        public static OptionModel UpdateToSql <T>(T model, ConfigModel config, Expression <Func <T, object> > field = null)
        {
            var result = new OptionModel();
            var dynGet = new DynamicGet <T>();

            result.IsCache = config.IsPropertyCache;

            try
            {
                result.Sql = string.Format("update {0} set", typeof(T).Name);
                var pInfo = PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache);

                if (field == null)
                {
                    #region 属性
                    pInfo.ForEach(a => {
                        result.Sql         = string.Format("{2} {0}={1}{0},", a.Name, config.Flag, result.Sql);
                        var itemValue      = dynGet.GetValue(model, a.Name, config.IsPropertyCache);
                        var temp           = DbProviderFactories.GetFactory(config).CreateParameter();
                        temp.ParameterName = a.Name;
                        temp.Value         = itemValue == null ? DBNull.Value : itemValue;
                        result.Param.Add(temp);
                    });
                    #endregion
                }
                else
                {
                    #region lambda
                    (field.Body as NewExpression).Members.ToList().ForEach(a => {
                        result.Sql         = string.Format("{2} {0}={1}{0},", a.Name, config.Flag, result.Sql);
                        var itemValue      = dynGet.GetValue(model, a.Name, config.IsPropertyCache);
                        var temp           = DbProviderFactories.GetFactory(config).CreateParameter();
                        temp.ParameterName = a.Name;
                        temp.Value         = itemValue == null ? DBNull.Value : itemValue;
                        result.Param.Add(temp);
                    });
                    #endregion
                }

                result.Sql       = result.Sql.Substring(0, result.Sql.Length - 1);
                result.IsSuccess = true;

                return(result);
            }
            catch (Exception ex)
            {
                Task.Run(() =>
                {
                    if (config.SqlErrorType == SqlErrorType.Db)
                    {
                        DbLogTable.LogException <T>(config, ex, "UpdateToSql<T>", result.Sql);
                    }
                    else
                    {
                        DbLog.LogException <T>(config.IsOutError, config.DbType, ex, "UpdateToSql<T>", result.Sql);
                    }
                });
                result.IsSuccess = false;
                return(result);
            }
        }
예제 #19
0
        /// <summary>
        /// 比对model
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="CacheItem">缓存实体</param>
        /// <param name="modelItem">实体</param>
        /// <returns></returns>
        public static CompareModel <T> CompareTo <T>(T CacheItem, T modelItem) where T : class, new()
        {
            var dynGet = new Property.DynamicGet <T>();
            var dynSet = new Property.DynamicSet <T>();
            var result = new CompareModel <T>();

            result.Item = modelItem;

            if (modelItem == null)
            {
                result.RemoveName.Add(dynGet.GetValue(CacheItem, "Name", true).ToStr());
                result.IsDelete = true;
                return(result);
            }

            var type = dynGet.GetValue(modelItem, "DataType", true).ToStr();

            if (type == "")
            {
                type = dynGet.GetValue(CacheItem, "DataType", true).ToStr();
            }

            var name = dynGet.GetValue(modelItem, "Name", true).ToStr();

            if (name == "")
            {
                name        = dynGet.GetValue(CacheItem, "Name", true).ToStr();
                result.Item = CacheItem;
            }

            foreach (var info in PropertyCache.GetPropertyInfo <T>())
            {
                var modelValue = dynGet.GetValue(modelItem, info.Name, true);
                var cacheValue = dynGet.GetValue(CacheItem, info.Name, true);

                dynSet.SetValue(result.Item, info.Name, modelValue, true);


                if ((modelValue != null && cacheValue != null && modelValue.ToStr().ToLower() != cacheValue.ToStr().ToLower()) ||
                    (modelValue == null && cacheValue != null) || (modelValue != null && cacheValue == null))
                {
                    result.IsUpdate = true;

                    switch (info.Name)
                    {
                    case "IsKey":
                    {
                        if (!(bool)modelValue)
                        {
                            result.RemoveKey.Add(name);
                        }

                        if ((bool)modelValue)
                        {
                            result.AddKey.Add(GetColumnType <T>(modelItem, type, name));
                        }
                        break;
                    }

                    case "IsNull":
                    {
                        if (!(bool)modelValue)
                        {
                            result.RemoveNull.Add(GetColumnType <T>(modelItem, type, name));
                        }

                        if ((bool)modelValue)
                        {
                            result.AddNull.Add(GetColumnType <T>(modelItem, type, name));
                        }
                        break;
                    }

                    case "Name":
                    {
                        if (modelValue == null)
                        {
                            result.RemoveName.Add(name);
                        }

                        if (modelValue != null)
                        {
                            result.AddName.Add(GetColumnType <T>(modelItem, type, name));
                        }
                        break;
                    }

                    case "Length":
                    case "Precision":
                    case "Scale":
                    {
                        result.Type.Add(GetColumnType <T>(modelItem, type, name));
                        break;
                    }

                    case "DataType":
                    {
                        result.Type.Add(GetColumnType <T>(modelItem, modelValue, name));
                        break;
                    }

                    case "Comments":
                    {
                        result.Comments.Add(new ColumnComments {
                                Comments = modelValue.ToStr(), Name = name, Type = GetColumnType <T>(modelItem, type, name)
                            });
                        break;
                    }

                    default:
                        break;
                    }
                }
            }

            return(result);
        }
예제 #20
0
        /// <summary>
        ///  to list
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="dr"></param>
        /// <param name="dbType"></param>
        /// <returns></returns>
        public static IList ToList(System.Type type, Object model, DbDataReader dr, ConfigModel config, List <string> field = null)
        {
            var list    = Activator.CreateInstance(type);
            var colList = new List <string>();

            if (dr == null)
            {
                return(null);
            }

            if (dr.HasRows)
            {
                colList = GetCol(dr);
            }

            var propertyList = PropertyCache.GetPropertyInfo(model, config.IsPropertyCache);

            while (dr.Read())
            {
                var item = Activator.CreateInstance(model.GetType());

                if (field == null || field.Count == 0)
                {
                    foreach (var info in propertyList)
                    {
                        if (!colList.Exists(a => string.Compare(a, info.Name, true) == 0))
                        {
                            continue;
                        }

                        if (info.PropertyType.IsGenericType && info.PropertyType.GetGenericTypeDefinition() != typeof(Nullable <>))
                        {
                            continue;
                        }

                        item = SetValue(item, dr, info, config);
                    }
                }
                else
                {
                    for (var i = 0; i < field.Count; i++)
                    {
                        if (!colList.Exists(a => string.Compare(a, field[i], true) == 0))
                        {
                            continue;
                        }

                        if (propertyList.Exists(a => string.Compare(a.Name, field[i], true) == 0))
                        {
                            var info = propertyList.Find(a => string.Compare(a.Name, field[i], true) == 0);
                            item = SetValue(item, dr, info, config);
                        }
                    }
                }

                list.GetType().GetMethods().ToList().ForEach(m =>
                {
                    if (m.Name == "Add")
                    {
                        BaseEmit.Invoke(list, m, new object[] { item });
                    }
                });
            }

            return((IList)list);
        }
예제 #21
0
        /// <summary>
        /// query field 1个表
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="field"></param>
        /// <returns></returns>
        public static FieldModel QueryField <T>(Expression <Func <T, bool> > predicate, Expression <Func <T, object> > field, ConfigModel config)
        {
            try
            {
                var result      = new FieldModel();
                var queryFields = new List <string>();
                var i           = 0;

                if (field == null)
                {
                    #region 无返回列
                    var list = PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache);

                    list.ForEach(a =>
                    {
                        queryFields.Add(string.Format("{0}.{1}", predicate.Parameters[0].Name, a.Name));
                        result.AsName.Add(a.Name);
                    });

                    result.Field = string.Join(",", queryFields);

                    #endregion
                }
                else
                {
                    #region  返回列
                    (field.Body as NewExpression).Arguments.ToList().ForEach(a =>
                    {
                        if (a is MethodCallExpression)
                        {
                            var methodName   = "";
                            var ower         = "";
                            var propertyName = GetPropertyMethod(a, out methodName, false, out ower);

                            if (string.Compare(methodName, "distinct", true) == 0)
                            {
                                queryFields.Add(string.Format("{2}{0} {3}.{1} ", methodName, propertyName, ower, predicate.Parameters[0].Name));
                                result.AsName.Add((a as MemberExpression).Member.Name);
                            }
                            else if (string.Compare(methodName, "sum", true) == 0)
                            {
                                if (config.DbType == DataDbType.SqlServer)
                                {
                                    propertyName = string.Format("isnull({1}.{0},0)", propertyName, predicate.Parameters[0].Name);
                                }

                                if (config.DbType == DataDbType.MySql || config.DbType == DataDbType.SQLite)
                                {
                                    propertyName = string.Format("ifnull({1}.{0},0)", propertyName, predicate.Parameters[0].Name);
                                }

                                if (config.DbType == DataDbType.Oracle)
                                {
                                    propertyName = string.Format("nvl({1}.{0},0)", propertyName, predicate.Parameters[0].Name);
                                }

                                if (config.DbType == DataDbType.DB2)
                                {
                                    propertyName = string.Format("coalesce({1}.{0},0)", propertyName, predicate.Parameters[0].Name);
                                }

                                queryFields.Add(string.Format("{0}({2}.{1})", methodName, propertyName, predicate.Parameters[0].Name));
                                result.AsName.Add((field.Body as NewExpression).Members[i].Name);
                            }
                            else
                            {
                                queryFields.Add(string.Format("{2}{0}({3}.{1})", methodName, propertyName, ower, predicate.Parameters[0].Name));
                                result.AsName.Add((field.Body as NewExpression).Members[i].Name);
                            }
                        }
                        else
                        {
                            queryFields.Add(string.Format("{0}.{1}", predicate.Parameters[0].Name, (a as MemberExpression).Member.Name));
                            result.AsName.Add((a as MemberExpression).Member.Name);
                        }
                        i++;
                    });
                    #endregion
                }

                result.Field = string.Join(",", queryFields);

                return(result);
            }
            catch (Exception ex)
            {
                if (string.Compare(config.SqlErrorType, SqlErrorType.Db, true) == 0)
                {
                    DbLogTable.LogException <T>(config, ex, "QueryField<T>", "");
                }
                else
                {
                    DbLog.LogException <T>(config.IsOutError, config.DbType, ex, "QueryField<T>", "");
                }

                return(new FieldModel
                {
                    Field = string.Format("{0}.*", predicate.Parameters[0].Name),
                    AsName = new List <string> {
                        predicate.Parameters[0].Name
                    }
                });
            }
        }
예제 #22
0
        /// <summary>
        /// model 转 update sql
        /// </summary>
        /// <typeparam name="T">泛型</typeparam>
        /// <param name="model">实体</param>
        /// <param name="sql">sql</param>
        /// <param name="oracleParam">参数</param>
        /// <returns></returns>
        public static OptionModel UpdateToSql <T>(T model, ConfigModel config, Expression <Func <T, object> > field = null, DbCommand cmd = null)
        {
            var result = new OptionModel();

            result.IsCache = config.IsPropertyCache;
            var where      = PrimaryKey(config, cmd, typeof(T));

            try
            {
                result.Sql = string.Format("update {0} set", typeof(T).Name);
                if (field == null)
                {
                    #region 属性
                    PropertyCache.GetPropertyInfo <T>(config.IsPropertyCache).ForEach(a =>
                    {
                        result.Sql         = string.Format("{2} {0}={1}{0},", a.Name, config.Flag, result.Sql);
                        var itemValue      = BaseEmit.Get <T>(model, a.Name);
                        var temp           = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter();
                        temp.ParameterName = a.Name;
                        temp.Value         = itemValue == null ? DBNull.Value : itemValue;
                        result.Param.Add(temp);
                    });
                    #endregion
                }
                else
                {
                    #region lambda
                    (field.Body as NewExpression).Members.ToList().ForEach(a =>
                    {
                        result.Sql         = string.Format("{2} {0}={1}{0},", a.Name, config.Flag, result.Sql);
                        var itemValue      = BaseEmit.Get <T>(model, a.Name);
                        var temp           = DbProviderFactories.GetFactory(config.ProviderName).CreateParameter();
                        temp.ParameterName = a.Name;
                        temp.Value         = itemValue == null ? DBNull.Value : itemValue;
                        result.Param.Add(temp);
                    });
                    #endregion
                }

                foreach (var item in where)
                {
                    if (result.Param.Exists(a => a.ParameterName == item))
                    {
                        var itemValue = BaseEmit.Get <T>(model, item);
                        if (itemValue == null)
                        {
                            result.IsSuccess = false;
                            result.Message   = string.Format("主键{0}值为空", item);
                            return(result);
                        }
                    }
                }

                result.Sql       = result.Sql.Substring(0, result.Sql.Length - 1);
                result.IsSuccess = true;

                return(result);
            }
            catch (Exception ex)
            {
                if (string.Compare(config.SqlErrorType, SqlErrorType.Db, true) == 0)
                {
                    DbLogTable.LogException(config, ex, "UpdateToSql<T>", result.Sql);
                }
                else
                {
                    DbLog.LogException(config.IsOutError, config.DbType, ex, "UpdateToSql<T>", result.Sql);
                }

                result.IsSuccess = false;
                return(result);
            }
        }