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 OrderBy(MemberExpression expression, SqlPack sqlPack) { string tableName = GetTableNameByExpression(expression, sqlPack); sqlPack.SetTableAlias(tableName); sqlPack += sqlPack.GetTableAlias(tableName) + "." + expression.Member.Name; return(sqlPack); }
protected override SqlPack Select(MemberExpression expression, SqlPack sqlPack) { string tableName = GetTableNameByExpression(expression, sqlPack); sqlPack.SetTableAlias(tableName); string tableAlias = sqlPack.GetTableAlias(tableName); if (!string.IsNullOrWhiteSpace(tableAlias)) { tableAlias += "."; } sqlPack.SelectFields.Add(tableAlias + expression.Member.Name); return(sqlPack); }
protected override SqlPack Select(ParameterExpression expression, SqlPack sqlPack) { string tableName = expression.GetTableNameByExpression(sqlPack); sqlPack.SetTableAlias(tableName); string tableAlias = sqlPack.GetTableAlias(tableName); if (!string.IsNullOrWhiteSpace(tableAlias)) { tableAlias += "."; } var colStr = tableAlias + "*"; sqlPack.SelectFields.Add(colStr); return(sqlPack); }
protected override SqlPack Sum(MemberExpression expression, SqlPack sqlPack) { string tableName = GetTableNameByExpression(expression, sqlPack); sqlPack.SetTableAlias(tableName); string tableAlias = sqlPack.GetTableAlias(tableName); string columnName = expression.Member.Name; if (!string.IsNullOrWhiteSpace(tableAlias)) { tableName += " " + tableAlias; columnName = tableAlias + "." + expression.Member.Name; } sqlPack.Sql.AppendFormat("SELECT SUM({0}) FROM {1}", columnName, tableName); return(sqlPack); }
public static string GetColumnName(this MemberExpression expression, SqlPack sqlPack) { if (expression == null) { return(""); } string tableName = GetTableNameByExpression(expression, sqlPack); sqlPack.SetTableAlias(tableName); string tableAlias = sqlPack.GetTableAlias(tableName); if (!string.IsNullOrWhiteSpace(tableAlias)) { tableAlias += "."; } string colName = tableAlias + expression.Member.Name; return(colName); }
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 Select(NewExpression expression, SqlPack sqlPack) { //foreach (Expression item in expression.Arguments) //{ // FluentExpressionSQLProvider.Select(item, sqlPack); //} var memberAliasExpList = expression.Members; string tableAlias = ""; string colStr = ""; int i = 0; foreach (Expression item in expression.Arguments) { var memberAliasExp = memberAliasExpList[i]; if (item is MemberExpression) { MemberExpression memberValueExp = item as MemberExpression; if (memberValueExp != null) { if (memberValueExp.Member.DeclaringType == ResolveConstants.TypeOfDateTime)//日期转换 { var value = memberValueExp.Expression.GetValueOfExpression(sqlPack); var valueDatetime = sqlPack.SqlDialectProvider.ConvertDateTime(memberValueExp.Member, value); if (memberAliasExp.Name.Equals(memberValueExp.Member.Name, System.StringComparison.InvariantCultureIgnoreCase)) { colStr = valueDatetime.Text; } else { colStr = valueDatetime.Text + " " + sqlPack.ColumnAsAliasString + memberAliasExp.Name; } } else if (memberValueExp.Member.Name == "Length" && memberValueExp.Member.DeclaringType == ResolveConstants.TypeOfString)//长度转换 { MemberExpression memberEx = memberValueExp.Expression as MemberExpression; string tableName = memberEx.GetTableNameByExpression(sqlPack); sqlPack.SetTableAlias(tableName); tableAlias = sqlPack.GetTableAlias(tableName); if (!string.IsNullOrWhiteSpace(tableAlias)) { tableAlias += "."; } string param = tableAlias + memberEx.Member.Name; colStr = sqlPack.SqlDialectProvider.ConvertDbFunction(DbFunctionType.Length, param); if (memberAliasExp.Name.Equals(memberEx.Member.Name, System.StringComparison.InvariantCultureIgnoreCase)) { //colStr = tableAlias + memberEx.Member.Name; } else { colStr += " " + sqlPack.ColumnAsAliasString + " " + memberAliasExp.Name; } } else if (memberValueExp.Member.MemberType == MemberTypes.Field) //局部变量 { var value = memberValueExp.Expression.GetValueOfExpression(sqlPack); var memberInfoType = memberValueExp.Member.GetPropertyOrFieldType(); var memberInfoValue = memberValueExp.Member.GetPropertyOrFieldValue(value); memberInfoValue = sqlPack.SqlDialectProvider.FormatValue(memberInfoValue, true);//format if (memberInfoType == ResolveConstants.TypeOfDateTime) { colStr = sqlPack.SqlDialectProvider.ConvertSqlValue(memberInfoValue, memberInfoType); } else { colStr = memberInfoValue.ToString(); } if (!string.IsNullOrEmpty(memberAliasExp.Name) && !string.IsNullOrEmpty(colStr)) { colStr += " " + sqlPack.ColumnAsAliasString + " " + memberAliasExp.Name; } } else { string tableName = memberValueExp.GetTableNameByExpression(sqlPack); sqlPack.SetTableAlias(tableName); //memberValueExp.Member.DeclaringType.Name tableAlias = sqlPack.GetTableAlias(tableName); //memberValueExp.Member.DeclaringType.Name if (!string.IsNullOrWhiteSpace(tableAlias)) { tableAlias += "."; } if (memberAliasExp.Name.Equals(memberValueExp.Member.Name, System.StringComparison.InvariantCultureIgnoreCase)) { colStr = tableAlias + memberValueExp.Member.Name; } else { colStr = tableAlias + memberValueExp.Member.Name + " " + sqlPack.ColumnAsAliasString + " " + memberAliasExp.Name; } } sqlPack.SelectFields.Add(colStr); } } else { sqlPack.CurrentColAlias = memberAliasExp.Name; FluentExpressionSQLProvider.Select(item, sqlPack); sqlPack.CurrentColAlias = null; } i++; } return(sqlPack); }
//public static object GetValueOfExpressionWithoutFormat(this Expression body ) //{ // if (body == null) // { // return string.Empty; // } // if (body is ConstantExpression) // { // return ((ConstantExpression)body).Value; // } // if (body is MemberExpression) // { // var member = ((MemberExpression)body); // var value = GetValueOfMemberExpression(member); // Type typeOfValue = null; // if (value != null) // { // typeOfValue = value.GetType(); // } // return (value); // } // if (body is UnaryExpression) // { // return GetValueOfExpressionWithoutFormat(((UnaryExpression)body).Operand); // } // if (body is NewExpression) // { // var args = ((NewExpression)body).Arguments; // //判断Select设置值 Select<UserInfo>(u => new { DT3=new DateTime(2015,10,11) }). // if (args.Count > 0) // { // return GetValueOfExpressionWithoutFormat(args[0]); // } // //foreach (var item in ((NewExpression)body).Arguments) // //{ // // GetValueOfExpression(item, sqlpack); // //} // } // //if (body is BinaryExpression) // //{ // // var binary = body as BinaryExpression; // // if (binary.Right.GetValueOfExpressionWithoutFormat() == null && (binary.NodeType == ExpressionType.Equal || binary.NodeType == ExpressionType.NotEqual)) // // { // // return string.Format("({0}{1}{2})", GetValueOfExpression(binary.Left, sqlpack), // // ConvertExpressionTypeToString(binary.NodeType, true), // // "NULL"); // // } // // else // // { // // return string.Format("({0}{1}{2})", GetValueOfExpression(binary.Left, sqlpack), // // ConvertExpressionTypeToString(binary.NodeType), // // GetValueOfExpression(binary.Right, sqlpack)); // // } // //} // //if (body is MethodCallExpression) // //{ // // var method = body as MethodCallExpression; // // return MethodCallFluentExpressionSQL.GetMethodResult(method, sqlpack); // //} // if (body is LambdaExpression) // { // return GetValueOfExpressionWithoutFormat(((LambdaExpression)body).Body); // } // return ""; //} public static object GetValueOfExpression(this Expression body, SqlPack sqlpack, bool needFormat = true) { if (body == null) { return(string.Empty); } if (body is ConstantExpression) { return(FormatValue(((ConstantExpression)body).Value, sqlpack, needFormat)); } if (body is MemberExpression) { var member = ((MemberExpression)body); if (member.Member.MemberType == MemberTypes.Property) { if (member.Member.DeclaringType == ResolveConstants.TypeOfDateTime)//日期转换 { if (member.Member == ResolveConstants.PropertyInfo_DateTime_Now || member.Member == ResolveConstants.PropertyInfo_DateTime_UtcNow || member.Member == ResolveConstants.PropertyInfo_DateTime_Today)//只能转换为常量的SQL 字符 { object valueDatetime = sqlpack.SqlDialectProvider.ConvertDateTime(member.Member, null); return(valueDatetime); } } string tableName = GetTableNameByExpression(member, sqlpack); sqlpack.SetTableAlias(tableName); string tableAlias = sqlpack.GetTableAlias(tableName); if (!string.IsNullOrWhiteSpace(tableAlias)) { tableAlias += "."; } return(tableAlias + member.Member.Name); //return member.Member.Name; } var value = GetValueOfMemberExpression(member); Type typeOfValue = null; if (value != null) { typeOfValue = value.GetType(); } if (IsListType(typeOfValue)) { var valueList = value as IEnumerable; var sb = new StringBuilder(); foreach (var item in value as IEnumerable) { sb.AppendFormat("{0},", FormatValue(item, sqlpack, needFormat)); } if (sb.Length == 0) { return(""); } return(sb.Remove(sb.Length - 1, 1).ToString()); } else { return(FormatValue(value, sqlpack, needFormat)); } } if (body is UnaryExpression) { return(GetValueOfExpression(((UnaryExpression)body).Operand, sqlpack, needFormat)); } if (body is NewExpression) { var args = ((NewExpression)body).Arguments; //判断Select设置值 Select<UserInfo>(u => new { DT3=new DateTime(2015,10,11) }). if (args.Count > 0) { return(GetValueOfExpression(args[0], sqlpack, needFormat)); } //foreach (var item in ((NewExpression)body).Arguments) //{ // GetValueOfExpression(item, sqlpack); //} } if (body is BinaryExpression) { var binary = body as BinaryExpression; if (binary.Right.GetValueOfExpression(sqlpack, needFormat) == null && (binary.NodeType == ExpressionType.Equal || binary.NodeType == ExpressionType.NotEqual)) { return(string.Format("({0}{1}{2})", GetValueOfExpression(binary.Left, sqlpack, needFormat), ConvertExpressionTypeToString(binary.NodeType, true), "NULL")); } else { return(string.Format("({0}{1}{2})", GetValueOfExpression(binary.Left, sqlpack, needFormat), ConvertExpressionTypeToString(binary.NodeType), GetValueOfExpression(binary.Right, sqlpack, needFormat))); } } if (body is MethodCallExpression) { var method = body as MethodCallExpression; return(MethodCallFluentExpressionSQL.GetMethodResult(method, sqlpack, needFormat)); //return string.Format("({0} IN ({1}))", GetValueOfExpression(method.Arguments[0], sqlpack), // GetValueOfExpression(method.Object, sqlpack)); } if (body is LambdaExpression) { return(GetValueOfExpression(((LambdaExpression)body).Body, sqlpack, needFormat)); } return(""); }