static void EnsureTrimCharArgumentIsSpaces(DbExpression exp) { var m = exp as DbMemberExpression; if (m == null) { throw new NotSupportedException(); } DbParameterExpression p; if (!DbExpressionExtension.TryConvertToParameterExpression(m, out p)) { throw new NotSupportedException(); } var arg = p.Value; if (arg == null) { throw new NotSupportedException(); } var chars = arg as char[]; if (chars.Length != 1 || chars[0] != ' ') { throw new NotSupportedException(); } }
/// <summary> /// 尝试将 exp 转换成 DbParameterExpression。 /// </summary> /// <param name="exp"></param> /// <returns></returns> public static DbExpression OptimizeDbExpression(this DbExpression exp) { DbExpression stripedExp = DbExpressionExtension.StripInvalidConvert(exp); DbExpression tempExp = stripedExp; List <DbConvertExpression> cList = null; while (tempExp.NodeType == DbExpressionType.Convert) { if (cList == null) { cList = new List <DbConvertExpression>(); } DbConvertExpression c = (DbConvertExpression)tempExp; cList.Add(c); tempExp = c.Operand; } if (tempExp.NodeType == DbExpressionType.Constant || tempExp.NodeType == DbExpressionType.Parameter) { return(stripedExp); } if (tempExp.NodeType == DbExpressionType.MemberAccess) { DbMemberExpression dbMemberExp = (DbMemberExpression)tempExp; if (ExistDateTime_NowOrDateTime_UtcNow(dbMemberExp)) { return(stripedExp); } DbParameterExpression val; if (DbExpressionExtension.TryConvertToParameterExpression(dbMemberExp, out val)) { if (cList != null) { if (val.Value == DBNull.Value)//如果是 null,则不需要 Convert 了,在数据库里没意义 { return(val); } DbConvertExpression c = null; for (int i = cList.Count - 1; i > -1; i--) { DbConvertExpression item = cList[i]; c = new DbConvertExpression(item.Type, val); } return(c); } return(val); } } return(stripedExp); }
public override DbExpression Visit(DbMemberExpression exp) { MemberInfo member = exp.Member; if (member.DeclaringType == UtilConstants.TypeOfDateTime) { if (member == UtilConstants.PropertyInfo_DateTime_Now) { this._sqlBuilder.Append("GETDATE()"); return(exp); } if (member == UtilConstants.PropertyInfo_DateTime_UtcNow) { this._sqlBuilder.Append("GETUTCDATE()"); return(exp); } if (member == UtilConstants.PropertyInfo_DateTime_Today) { this.BuildCastState("GETDATE()", "DATE"); return(exp); } if (member == UtilConstants.PropertyInfo_DateTime_Date) { this.BuildCastState(exp.Expression, "DATE"); return(exp); } if (this.IsDatePart(exp)) { return(exp); } } DbParameterExpression newExp; if (DbExpressionExtension.TryConvertToParameterExpression(exp, out newExp)) { return(newExp.Accept(this)); } if (member.Name == "Length" && member.DeclaringType == UtilConstants.TypeOfString) { this._sqlBuilder.Append("LEN("); exp.Expression.Accept(this); this._sqlBuilder.Append(")"); return(exp); } else if (member.Name == "Value" && ReflectionExtension.IsNullable(exp.Expression.Type)) { exp.Expression.Accept(this); return(exp); } throw new NotSupportedException(string.Format("'{0}.{1}' is not supported.", member.DeclaringType.FullName, member.Name)); }
public override DbExpression Visit(DbMemberExpression exp) { MemberInfo member = exp.Member; if (member == OracleSemantics.PropertyInfo_ROWNUM) { this.SqlBuilder.Append("ROWNUM"); return(exp); } if (member.DeclaringType == PublicConstants.TypeOfDateTime) { if (member == PublicConstants.PropertyInfo_DateTime_Now) { this.SqlBuilder.Append("SYSTIMESTAMP"); return(exp); } if (member == PublicConstants.PropertyInfo_DateTime_UtcNow) { this.SqlBuilder.Append("SYS_EXTRACT_UTC(SYSTIMESTAMP)"); return(exp); } if (member == PublicConstants.PropertyInfo_DateTime_Today) { //other way: this.SqlBuilder.Append("TO_DATE(TO_CHAR(SYSDATE,'yyyy-mm-dd'),'yyyy-mm-dd')"); this.SqlBuilder.Append("TRUNC(SYSDATE,'DD')"); return(exp); } if (member == PublicConstants.PropertyInfo_DateTime_Date) { this.SqlBuilder.Append("TRUNC("); exp.Expression.Accept(this); this.SqlBuilder.Append(",'DD')"); return(exp); } if (this.IsDatePart(exp)) { return(exp); } } if (this.IsDateSubtract(exp)) { return(exp); } if (member.Name == "Length" && member.DeclaringType == PublicConstants.TypeOfString) { this.SqlBuilder.Append("LENGTH("); exp.Expression.Accept(this); this.SqlBuilder.Append(")"); return(exp); } if (member.Name == "Value" && ReflectionExtension.IsNullable(exp.Expression.Type)) { exp.Expression.Accept(this); return(exp); } DbParameterExpression newExp; if (DbExpressionExtension.TryConvertToParameterExpression(exp, out newExp)) { return(newExp.Accept(this)); } throw new NotSupportedException(string.Format("'{0}.{1}' is not supported.", member.DeclaringType.FullName, member.Name)); }