protected override SqlPack Where(MemberExpression expression, SqlPack sqlPack) { //datetime.now if (expression.Member.DeclaringType == ResolveConstants.TypeOfDateTime)//日期转换 { var value = expression.GetValueOfExpression(sqlPack, false); object valueDatetime = sqlPack.SqlDialectProvider.ConvertDateTime(expression.Member, value); sqlPack.AddDbParameter(valueDatetime); return(sqlPack); } else if (expression.Member.Name == "Length" && expression.Member.DeclaringType == ResolveConstants.TypeOfString)//长度转换 { MemberExpression memberEx = expression.Expression as MemberExpression; string tableName = GetTableNameByExpression(memberEx, sqlPack); sqlPack.SetTableAlias(tableName); string tableAlias = sqlPack.GetTableAlias(tableName); if (!string.IsNullOrWhiteSpace(tableAlias)) { tableAlias += "."; } string param = tableAlias + memberEx.Member.Name; sqlPack += " " + sqlPack.SqlDialectProvider.ConvertDbFunction(DbFunctionType.Length, param); //sqlPack += ("LEN("); //Where(((MemberExpression)expression.Expression), sqlPack); //sqlPack += (")"); return(sqlPack); } else if (expression.Member.MemberType == MemberTypes.Property || expression.Member.MemberType == MemberTypes.Field) { object val = null; if (expression.TryGetValueOfMemberExpressionWithFormat(sqlPack, out val, false))//如果能获取值就能直接引用变量的值,如 where(p=>p.Id > info.Id) { val = val.SqlVerifyFragment2(); sqlPack.AddDbParameter(val); return(sqlPack); } else { string tableName = GetTableNameByExpression(expression, sqlPack); sqlPack.SetTableAlias(tableName); //expression.Member.DeclaringType.Name string tableAlias = sqlPack.GetTableAlias(tableName); //expression.Member.DeclaringType.Name if (!string.IsNullOrWhiteSpace(tableAlias)) { tableAlias += "."; } sqlPack += " " + tableAlias + expression.Member.Name; //sqlPack.HasParamName = true; return(sqlPack); } } sqlPack.AddDbParameter(expression.GetValueOfExpression(sqlPack, false)); return(sqlPack); }
protected override SqlPack Insert(NewExpression expression, SqlPack sqlPack) { StringBuilder columns = new StringBuilder(); for (int i = 0; i < expression.Members.Count; i++) { MemberInfo m = expression.Members[i]; //ConstantExpression c = expression.Arguments[i] as ConstantExpression; //object value = c.Value; columns.Append(m.Name); columns.Append(","); object value = expression.Arguments[i].GetValueOfExpression(sqlPack, false); sqlPack.AddDbParameter(value); sqlPack += ","; } columns = columns.Remove(columns.Length - 1, 1); if (sqlPack[sqlPack.Length - 1] == ',') { sqlPack.Sql.Remove(sqlPack.Length - 1, 1); } sqlPack.FormatSql(columns.ToString()); return(sqlPack); }
protected override SqlPack In(ConstantExpression expression, SqlPack sqlPack) { //sqlPack += " ("; object value = expression.GetValueOfExpression(sqlPack, false); value = value.SqlVerifyFragment2(); sqlPack.AddDbParameter(value); //sqlPack += ")"; //if (expression.Type == ResolveConstants.TypeOfString || expression.Type.Name == "String") //{ // sqlPack.Sql.AppendFormat("'{0}',", value); //} //else //{ // sqlPack.Sql.AppendFormat("{0},", value); //} return(sqlPack); // object value = expression.GetValueOfExpression(sqlPack); //if (expression.Type == ResolveConstants.TypeOfString || expression.Type.Name == "String") //{ // sqlPack.Sql.AppendFormat("'{0}',", value); //} //else //{ // sqlPack.Sql.AppendFormat("{0},", value); //} //return sqlPack; }
protected override SqlPack Insert(MemberInitExpression expression, SqlPack sqlPack) { var datas = GetValueOfMemberInit(expression); StringBuilder columns = new StringBuilder(); MemberInfo m = null; object value = null; foreach (var item in datas) { m = item.Key; columns.Append(m.Name); columns.Append(","); value = item.Value.GetValueOfExpression(sqlPack, false); sqlPack.AddDbParameter(value); sqlPack += ","; } columns = columns.Remove(columns.Length - 1, 1); if (sqlPack[sqlPack.Length - 1] == ',') { sqlPack.Sql.Remove(sqlPack.Length - 1, 1); } sqlPack.FormatSql(columns.ToString()); return(sqlPack); }
protected override SqlPack Update(NewExpression expression, SqlPack sqlPack) { for (int i = 0; i < expression.Members.Count; i++) { MemberInfo m = expression.Members[i]; //ConstantExpression c = expression.Arguments[i] as ConstantExpression; sqlPack += m.Name + " ="; object value = expression.Arguments[i].GetValueOfExpression(sqlPack, false); sqlPack.AddDbParameter(value); sqlPack += ","; } if (sqlPack[sqlPack.Length - 1] == ',') { sqlPack.Sql.Remove(sqlPack.Length - 1, 1); } return(sqlPack); }
protected override SqlPack Where(ConstantExpression expression, SqlPack sqlPack) { //object value = ConvertToData(expression, sqlPack);//expression.Value object value = expression.GetValueOfExpression(sqlPack, false); //if (sqlPack.WhereConditionIndex ==1 && expression.Type == typeof(bool)) //只有第一次where才会拼接 1=1 或者1=0 //{ // string str = (int)value == 1 ? TrueLiteral : FalseLiteral; // sqlPack += " "+str; // return sqlPack; //} value = value.SqlVerifyFragment2(); sqlPack.AddDbParameter(value); return(sqlPack); }
protected override SqlPack OrderBy(MethodCallExpression expression, SqlPack sqlPack) { object methodValue = null; if (expression.TryGetValueOfMethodCallExpression(out methodValue)) { //默认执行方法 var value = methodValue;// sqlPack.SqlDialectProvider.FormatValue(methodValue); value = value.SqlVerifyFragment2(); sqlPack.AddDbParameter(value); //sqlPack += " " + sqlPack.SqlDialectProvider.FormatValue(methodValue); sqlPack.CurrentDbFunctionResult = null; return(sqlPack); } var key = expression.Method; if (key.IsGenericMethod) { key = key.GetGenericMethodDefinition(); } Action <MethodCallExpression, SqlPack> action; if (_Methods.TryGetValue(key.Name, out action)) { action(expression, sqlPack); sqlPack += " " + sqlPack.CurrentDbFunctionResult; sqlPack.CurrentDbFunctionResult = null; return(sqlPack); } throw new NotImplementedException("无法解析方法" + expression.Method); }
protected override SqlPack In(NewArrayExpression expression, SqlPack sqlPack) { sqlPack += " ("; List <object> args = new List <object>(); foreach (Expression expressionItem in expression.Expressions) { args.Add(expressionItem.GetValueOfExpression(sqlPack, false)); //FluentExpressionSQLProvider.In(expressionItem, sqlPack); } sqlPack.AddDbParameter(args); //if (sqlPack.Sql[sqlPack.Sql.Length - 1] == ',') //{ // sqlPack.Sql.Remove(sqlPack.Sql.Length - 1, 1); //} sqlPack += ")"; return(sqlPack); }
protected override SqlPack Join(MemberExpression expression, SqlPack sqlPack) { if (expression.Expression != null && expression.Expression is ConstantExpression) { object value = expression.GetValueOfExpression(sqlPack, false); //expression.Value sqlPack.AddDbParameter(value); return(sqlPack); } string tableName = GetTableNameByExpression(expression, sqlPack); sqlPack.SetTableAlias(tableName); string tableAlias = sqlPack.GetTableAlias(tableName); if (!string.IsNullOrWhiteSpace(tableAlias)) { tableAlias += "."; } sqlPack += " " + tableAlias + expression.Member.Name; return(sqlPack); }
protected override SqlPack Update(MemberInitExpression expression, SqlPack sqlPack) { var datas = GetValueOfMemberInit(expression); MemberInfo m = null; object value = null; foreach (var item in datas) { m = item.Key; sqlPack += m.Name + " ="; value = item.Value.GetValueOfExpression(sqlPack, false); sqlPack.AddDbParameter(value); sqlPack += ","; } if (sqlPack[sqlPack.Length - 1] == ',') { sqlPack.Sql.Remove(sqlPack.Length - 1, 1); } return(sqlPack); }
protected override SqlPack Where(MethodCallExpression expression, SqlPack sqlPack) { //if (expression.Object != null && expression.Object.CanGetValue()) //{ // object value = null; // value = expression.Object.GetValueOfExpression(sqlPack); // if (value != null) // { // sqlPack += " " + value; // sqlPack.CurrentDbFunctionResult = null; // return sqlPack; // } //} object methodValue = null; if (expression.TryGetValueOfMethodCallExpression(out methodValue)) { //默认执行方法 var value = methodValue;// sqlPack.SqlDialectProvider.FormatValue(methodValue); value = value.SqlVerifyFragment2(); sqlPack.AddDbParameter(value); //sqlPack += " " + sqlPack.SqlDialectProvider.FormatValue(methodValue); sqlPack.CurrentDbFunctionResult = null; return(sqlPack); } var key = expression.Method; if (key.IsGenericMethod) { key = key.GetGenericMethodDefinition(); } Action <MethodCallExpression, SqlPack> action; if (_Methods.TryGetValue(key.Name, out action)) { action(expression, sqlPack); //if (expression.Object != null) //{ // FluentExpressionSQLProvider.Where(expression.Object, sqlPack); //} //sqlPack.AddDbParameter(sqlPack.CurrentDbFunctionResult); sqlPack += " " + sqlPack.CurrentDbFunctionResult; sqlPack.CurrentDbFunctionResult = null; return(sqlPack); } throw new NotImplementedException("无法解析方法" + expression.Method); }