/// <summary> /// 获取实体属性的参数和SQL /// </summary> /// <param name="entity"></param> /// <returns></returns> private List <ParamSqlModel> GetParamSQLByEntityProp(TEntity entity) { List <ParamSqlModel> paramSqlModels = new List <ParamSqlModel>(); //获取公共属性 CommonProperty cmmonProperty = (CommonProperty)entity; //如果没有变更则返回null if (cmmonProperty.ChanageProperty.Count == 0) { return(null); } //循环遍历属性得到SQL脚本和参数 foreach (PropertyInfo prop in entity.GetType().GetProperties()) { ParamSqlModel paramSqlModel = new ParamSqlModel(); //如果不包含在变更集里面则跳出 if (cmmonProperty.ChanageProperty.ContainsKey(prop.Name) == false) { continue; } //获取属性数据库信息 EntityPropColumnAttributes columnAttribute = columnAttrList.Where(w => w.propName.ToLower() == prop.Name.ToLower()).First(); //字段 paramSqlModel.Field = columnAttribute.fieldName; paramSqlModel.IsDbGenerated = columnAttribute.isDbGenerated; paramSqlModel.IsPrimaryKey = columnAttribute.isPrimaryKey; //SQL字符 string propSql = columnAttribute.fieldName + "=@" + columnAttribute.fieldName; paramSqlModel.SQL = propSql; //参数添加 object val = prop.GetValue(entity, null); SqlParameter param = new SqlParameter("@" + columnAttribute.fieldName, val ?? DBNull.Value); DbType dbtype; Enum.TryParse(prop.PropertyType.Name, out dbtype); param.DbType = dbtype; //参数赋值 paramSqlModel.Param = param; paramSqlModels.Add(paramSqlModel); } return(paramSqlModels); }
/// <summary> /// 二元运算符表达式 /// </summary> /// <param name="left"></param> /// <param name="right"></param> /// <param name="type"></param> /// <returns></returns> string BinarExpressionProvider(System.Linq.Expressions.Expression left, System.Linq.Expressions.Expression right, System.Linq.Expressions.ExpressionType type) { string where = "("; //先处理左边 string leftStr = ExpressionRouter(left); //获取实体列的特性 List <EntityPropColumnAttributes> columnAttrList = AttributeHelper.GetEntityColumnAtrributes <TEntity>(); var list = columnAttrList.Where(w => w.propName == leftStr); if (list.Count() > 0) { EntityPropColumnAttributes columnAttribute = list.First(); leftStr = columnAttribute.fieldName; } //节点类型 string typeStr = ExpressionTypeCast(type); //再处理右边 string rightStr = RightExpressionRouter(right).ToStr(); where += leftStr; where += typeStr; if (rightStr == "null") { if (where.EndsWith(" =")) { where = where.Substring(0, where.Length - 2) + " is null"; } else if (where.EndsWith("<>")) { where = where.Substring(0, where.Length - 2) + " is not null"; } } else { //如果左侧包含(则代表左侧非字段 if (leftStr.Contains("(")) { where += rightStr; } else { int num = random.Next(100, 999); where += "@" + leftStr + num; listPara.Add(new SqlParameter("@" + leftStr + num, rightStr)); } } return(where += ")"); }
/// <summary> /// 修改 /// </summary> /// <param name="id">主键值</param> /// <returns></returns> public int Update(TEntity entity) { EntityPropColumnAttributes columnAttribute = columnAttrList.Where(w => w.fieldName.ToLower() == PrimaryKey.ToLower()).First(); //获取属性及属性值 PropertyInfo prop = typeof(TEntity).GetProperty(columnAttribute.propName); object value = prop.GetValue(entity, null); //拼接条件 List <Expression> express = new List <Expression>(); express.Add(new Expression(columnAttribute.propName, ConditionEnum.Eq, value)); return(Update(entity, express)); }
/// <summary> /// 获取实体的列特性 /// </summary> /// <returns></returns> public static List <EntityPropColumnAttributes> GetEntityColumnAtrributes <TEntity>() where TEntity : class, new() { List <EntityPropColumnAttributes> list = new List <EntityPropColumnAttributes>(); TEntity model = new TEntity(); foreach (PropertyInfo prop in model.GetType().GetProperties()) { EntityPropColumnAttributes entity = new EntityPropColumnAttributes(); entity.propName = prop.Name; entity.fieldName = prop.Name; entity.isPrimaryKey = false; entity.isDbGenerated = false; Type type = Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType; entity.typeName = type.FullName; ColumnAttribute columnAttribute = prop.GetCustomAttribute <ColumnAttribute>(); if (columnAttribute != null) { entity.fieldName = columnAttribute.Name; } KeyAttribute keyAttribute = prop.GetCustomAttribute <KeyAttribute>(); if (keyAttribute != null) { entity.isPrimaryKey = true; } DatabaseGeneratedAttribute databaseGeneratedAttribute = prop.GetCustomAttribute <DatabaseGeneratedAttribute>(); if (databaseGeneratedAttribute != null) { entity.isDbGenerated = databaseGeneratedAttribute.DatabaseGeneratedOption == DatabaseGeneratedOption.Identity ? true : false; } list.Add(entity); } return(list); }
string MethodExpression(System.Linq.Expressions.Expression exp) { System.Linq.Expressions.MethodCallExpression mce = (System.Linq.Expressions.MethodCallExpression)exp; string key = ExpressionRouter(mce.Arguments[0]); object obj = RightExpressionRouter(mce.Arguments[1]); //对象属性 EntityPropColumnAttributes columnAttribute = columnAttrList.Where(w => w.propName == key).First(); key = columnAttribute.fieldName; //参数名称 string paramName = "@" + key + random.Next(1000, 9999); string values = ""; #region 拼接参数值 if (mce.Method.Name == "Like" || mce.Method.Name == "NotLike") { listPara.Add(new SqlParameter(paramName, "%" + obj.ToStr() + "%")); } if (mce.Method.Name == "LeftLike") { listPara.Add(new SqlParameter(paramName, obj.ToStr() + "%")); } if (mce.Method.Name == "RightLike") { listPara.Add(new SqlParameter(paramName, "%" + obj.ToStr())); } if (mce.Method.Name == "In" || mce.Method.Name == "NotIn") { string json = Newtonsoft.Json.JsonConvert.SerializeObject(obj); List <object> list = Newtonsoft.Json.JsonConvert.DeserializeObject <List <object> >(json); if (list.Count == 0) { return(" (1=2) "); } int index = 0; foreach (var value in list) { index++; listPara.Add(new SqlParameter(paramName + index, value.ToStr())); values += paramName + index + ","; } } values = values.TrimEnd(','); #endregion if (mce.Method.Name == "Like" || mce.Method.Name == "LeftLike" || mce.Method.Name == "RightLike") { return(string.Format("({0} like {1})", key, paramName)); } else if (mce.Method.Name == "NotLike") { return(string.Format("({0} Not like {1})", key, paramName)); } else if (mce.Method.Name == "In") { return(string.Format("{0} In ({1})", key, values)); } else if (mce.Method.Name == "NotIn") { return(string.Format("{0} Not In ({1})", key, values)); } return(" (1=2) "); }
/// <summary> /// 获取表达式列表对应的参数列表和条件 /// </summary> /// <param name="express"></param> /// <returns></returns> public CoreFrameworkEntity GetParaListAndWhere(List <Expression> express) { //获取实体列的特性 List <EntityPropColumnAttributes> columnAttrList = AttributeHelper.GetEntityColumnAtrributes <TEntity>(); #region 获取参数和条件 //参数列表 List <SqlParameter> listPara = new List <SqlParameter>(); CoreFrameworkEntity entity = new CoreFrameworkEntity(); if (express == null || express.Count == 0) { entity.ParaList = listPara; entity.Where = "1=1"; return(entity); } //条件 string where = ""; int i = 0;//运行的位置,从下标0开始 foreach (Expression exp in express) { //当两个条件没有使用连接符时,则默认用and拼接,从第一个参数后试用 if (i > 0) { //如果上一个参数不是连接符时,默认每个参数是以and的形式拼接 string join = string.Empty; switch (express[i - 1].Join) { case JoinEnum.And: join = "and"; break; case JoinEnum.Or: join = "or"; break; } where += " " + join; } if (string.IsNullOrEmpty(exp.FieldName) || exp.Value == null) { continue; } EntityPropColumnAttributes column = columnAttrList.Where(w => w.propName.ToLower() == exp.FieldName.ToLower()).FirstOrDefault(); string fieldName = column != null ? column.fieldName : exp.FieldName; //判断个数是为了防止参数名相同 int fieldCount = express.Where(e => e.FieldName == exp.FieldName).Count(); string paraName = fieldCount == 1 ? exp.FieldName : exp.FieldName + "_p" + i.ToStr(); //加空格 where += " "; #region 条件语句 switch (exp.Condition) { case ConditionEnum.Like: listPara.Add(new SqlParameter("@" + paraName, "%" + exp.Value + "%")); where += fieldName + " like @" + paraName; break; case ConditionEnum.LeftLike: listPara.Add(new SqlParameter("@" + paraName, "%" + exp.Value)); where += fieldName + " like @" + paraName; break; case ConditionEnum.RightLike: listPara.Add(new SqlParameter("@" + paraName, exp.Value + "%")); where += fieldName + " like @" + paraName; break; case ConditionEnum.NotLike: listPara.Add(new SqlParameter("@" + paraName, "%" + exp.Value + "%")); where += fieldName + " not like @" + paraName; break; case ConditionEnum.In: List <SqlParameter> paramConvertIn = GetParamList((List <object>)exp.Value, exp.FieldName); listPara.AddRange(paramConvertIn); where += fieldName + " in (" + string.Join(",", paramConvertIn.Select(s => s.ParameterName).ToArray()) + ")"; break; case ConditionEnum.NotIn: List <SqlParameter> paramConvertNotIn = GetParamList((List <object>)exp.Value, exp.FieldName); listPara.AddRange(paramConvertNotIn); where += fieldName + " not in (" + string.Join(",", paramConvertNotIn.Select(s => s.ParameterName).ToArray()) + ")"; break; default: string sign = "="; switch (exp.Condition) { case ConditionEnum.Eq: sign = "="; break; case ConditionEnum.Ne: sign = "<>"; break; case ConditionEnum.Gt: sign = ">"; break; case ConditionEnum.Ge: sign = ">="; break; case ConditionEnum.Lt: sign = "<"; break; case ConditionEnum.Le: sign = "<="; break; } listPara.Add(new SqlParameter("@" + paraName, exp.Value)); where += fieldName + " " + sign + " @" + paraName; break; } #endregion i++; } #endregion entity.ParaList = listPara; entity.Where = where; return(entity); }