/// <summary> /// /// </summary> /// <param name="expr"></param> /// <param name="function"></param> /// <param name="obj"></param> /// <returns></returns> public static string GetMemberName(System.Linq.Expressions.Expression expr, out ColumnFunction function, out MemberExpression obj) { if (expr.NodeType == ExpressionType.Convert) { expr = ((UnaryExpression)expr).Operand; } if (expr is MemberExpression) { function = ColumnFunction.None; obj = (MemberExpression)expr; return(obj.Member.Name); } if (expr is MethodCallExpression) { var e = (MethodCallExpression)expr; if (e.Method.Name == "ToLower" && e.Object is MemberExpression) { function = ColumnFunction.ToLower; obj = (MemberExpression)e.Object; return(obj.Member.Name); } if (e.Method.Name == "ToUpper" && e.Object is MemberExpression) { function = ColumnFunction.ToUpper; obj = (MemberExpression)e.Object; return(obj.Member.Name); } throw new Exception("暂时不支持的Lambda表达式写法!请使用经典写法!"); } throw new Exception("暂时不支持的Lambda表达式写法!请使用经典写法!"); }
public static string GetMemberName(Expression expr, out ColumnFunction function, out MemberExpression obj) { if (expr.NodeType == ExpressionType.Convert) { expr = ((UnaryExpression)expr).Operand; } if (expr is MemberExpression) { function = ColumnFunction.None; obj = (MemberExpression)expr; return(GetColumnName(obj)); } if (expr is MethodCallExpression) { var e = (MethodCallExpression)expr; if (e.Method.Name == "ToLower" && e.Object is MemberExpression) { function = ColumnFunction.ToLower; obj = (MemberExpression)e.Object; return(GetColumnName(obj)); } if (e.Method.Name == "ToUpper" && e.Object is MemberExpression) { function = ColumnFunction.ToUpper; obj = (MemberExpression)e.Object; return(GetColumnName(obj)); } } throw new LinqException("The expression must be 'Column op const' or 'Column op Column'"); }
private IPropertyMapper getPropertyMapper(Expression expr, out ColumnFunction function, out MemberExpression obj) { if (expr.NodeType == ExpressionType.Convert) { expr = ((UnaryExpression)expr).Operand; } if (expr is MemberExpression) { function = ColumnFunction.None; obj = (MemberExpression)expr; return(getPropertyMapper(obj)); } if (expr is MethodCallExpression) { var e = (MethodCallExpression)expr; if (e.Method.Name == "ToLower" && e.Object is MemberExpression) { function = ColumnFunction.ToLower; obj = (MemberExpression)e.Object; return(getPropertyMapper(obj)); } if (e.Method.Name == "ToUpper" && e.Object is MemberExpression) { function = ColumnFunction.ToUpper; obj = (MemberExpression)e.Object; return(getPropertyMapper(obj)); } } throw new MapleException("The expression must be 'Column op const' or 'Column op Column'"); }
public KeyValueClause(string key, object value, CompareOpration co, ColumnFunction function) : this(new KeyValue(key, value), co) { this.function = function; }
/// <summary> /// 生成SQL片段和参数 /// </summary> /// <param name="propertyMapper"></param> /// <param name="function"></param> /// <param name="co"></param> /// <param name="value"></param> /// <param name="dbTranslator"></param> /// <param name="sBuilder"></param> /// <param name="dpc"></param> private void buildSqlAndDataParameter(IPropertyMapper propertyMapper, ColumnFunction function, CompareOpration co, object value, IDbTranslator dbTranslator, StringBuilder sBuilder, DataParameterCollection dpc) { //获取参数名称 string strKey = dbTranslator.Quote(string.Format("{0}_{1}", propertyMapper.ColumnName, dpc.Count)); //拼接SQL 1 switch (function) { //处理函数 case ColumnFunction.ToLower: sBuilder.Append(string.Format("LOWER({0})", propertyMapper.ColumnName)); break; case ColumnFunction.ToUpper: sBuilder.Append(string.Format("UPPER({0})", propertyMapper.ColumnName)); break; default: sBuilder.Append(propertyMapper.ColumnName); break; } //拼接SQL 2 if (value == null) { if (co == CompareOpration.Equal) { sBuilder.Append(" IS NULL "); } else if (co == CompareOpration.NotEqual) { sBuilder.Append(" IS NOT NULL "); } else { throw new MapleException("该操作不支持!NULL value only supported Equal and NotEqual!"); } } else { switch (co) { case CompareOpration.Equal: sBuilder.Append(" = "); sBuilder.Append(dbTranslator.QuoteParameter(strKey)); break; case CompareOpration.GreatOrEqual: sBuilder.Append(" >= "); sBuilder.Append(dbTranslator.QuoteParameter(strKey)); break; case CompareOpration.GreatThan: sBuilder.Append(" > "); sBuilder.Append(dbTranslator.QuoteParameter(strKey)); break; case CompareOpration.LessOrEqual: sBuilder.Append(" <= "); sBuilder.Append(dbTranslator.QuoteParameter(strKey)); break; case CompareOpration.LessThan: sBuilder.Append(" < "); sBuilder.Append(dbTranslator.QuoteParameter(strKey)); break; case CompareOpration.Like: sBuilder.Append(" LIKE "); sBuilder.Append(dbTranslator.QuoteParameter(strKey)); value = string.Format("%{0}%", value); break; case CompareOpration.StartsWith: sBuilder.Append(" LIKE "); sBuilder.Append(dbTranslator.QuoteParameter(strKey)); value = string.Format("{0}%", value); break; case CompareOpration.EndsWith: sBuilder.Append(" LIKE "); sBuilder.Append(dbTranslator.QuoteParameter(strKey)); value = string.Format("%{0}", value); break; case CompareOpration.NotEqual: sBuilder.Append(" <> "); sBuilder.Append(dbTranslator.QuoteParameter(strKey)); break; default: throw new MapleException("该操作不支持!CompareOpration = " + co); } //添加查询参数 dpc.Add(new DataParameter(strKey, value, propertyMapper.DbType, propertyMapper.Size, ParameterDirection.Input)); } }