/// <summary> /// In /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> /// <returns>SqlWrapper</returns> public override SqlWrapper In(MethodCallExpression expression, SqlWrapper sqlWrapper) { var val = expression?.ToObject(); if (val != null) { sqlWrapper += "("; if (val.GetType().IsArray || typeof(IList).IsAssignableFrom(val.GetType())) { var list = val as IList; if (list?.Count > 0) { foreach (var item in list) { SqlExpressionProvider.In(Expression.Constant(item, item.GetType()), sqlWrapper); sqlWrapper += ","; } } } else { SqlExpressionProvider.In(Expression.Constant(val, val.GetType()), sqlWrapper); } if (sqlWrapper[sqlWrapper.Length - 1] == ',') { sqlWrapper.Remove(sqlWrapper.Length - 1, 1); } sqlWrapper += ")"; } return(sqlWrapper); }
/// <summary> /// In /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql包装器</param> /// <returns>SqlWrapper</returns> public override SqlWrapper In(NewArrayExpression expression, SqlWrapper sqlWrapper) { sqlWrapper += "("; foreach (var item in expression.Expressions) { SqlExpressionProvider.In(item, sqlWrapper); sqlWrapper += ","; } sqlWrapper.RemoveLast(','); sqlWrapper += ")"; return(sqlWrapper); }
/// <summary> /// In /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> /// <returns>SqlWrapper</returns> public override SqlWrapper In(NewArrayExpression expression, SqlWrapper sqlWrapper) { sqlWrapper += "("; foreach (Expression expressionItem in expression.Expressions) { SqlExpressionProvider.In(expressionItem, sqlWrapper); sqlWrapper += ","; } if (sqlWrapper[sqlWrapper.Length - 1] == ',') { sqlWrapper.Remove(sqlWrapper.Length - 1, 1); } sqlWrapper += ")"; return(sqlWrapper); }
/// <summary> /// In /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> /// <returns>SqlWrapper</returns> public override SqlWrapper In(MemberExpression expression, SqlWrapper sqlWrapper) { var obj = expression.ToObject(); if (obj is IEnumerable array) { sqlWrapper += "("; foreach (var item in array) { SqlExpressionProvider.In(Expression.Constant(item), sqlWrapper); sqlWrapper += ","; } if (sqlWrapper[sqlWrapper.Length - 1] == ',') { sqlWrapper.Remove(sqlWrapper.Length - 1, 1); } sqlWrapper += ")"; } return(sqlWrapper); }
/// <summary> /// Not In /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> private static void NotIn(MethodCallExpression expression, SqlWrapper sqlWrapper) { SqlExpressionProvider.Where(expression.Arguments[0], sqlWrapper); sqlWrapper += " NOT IN "; SqlExpressionProvider.In(expression.Arguments[1], sqlWrapper); }
/// <summary> /// Contains /// </summary> /// <param name="expression">表达式树</param> /// <param name="sqlWrapper">sql打包对象</param> private static void Contains(MethodCallExpression expression, SqlWrapper sqlWrapper) { if (expression.Object != null) { if (typeof(IList).IsAssignableFrom(expression.Object.Type)) { SqlExpressionProvider.Where(expression.Arguments[0], sqlWrapper); sqlWrapper += " IN "; SqlExpressionProvider.In(expression.Object, sqlWrapper); } else { SqlExpressionProvider.Where(expression.Object, sqlWrapper); switch (sqlWrapper.DatabaseType) { case DatabaseType.SqlServer: sqlWrapper += " LIKE '%' + "; break; case DatabaseType.MySql: case DatabaseType.PostgreSql: sqlWrapper += " LIKE CONCAT('%',"; break; case DatabaseType.Oracle: case DatabaseType.Sqlite: sqlWrapper += " LIKE '%' || "; break; default: break; } SqlExpressionProvider.Where(expression.Arguments[0], sqlWrapper); switch (sqlWrapper.DatabaseType) { case DatabaseType.SqlServer: sqlWrapper += " + '%'"; break; case DatabaseType.MySql: case DatabaseType.PostgreSql: sqlWrapper += ",'%')"; break; case DatabaseType.Oracle: case DatabaseType.Sqlite: sqlWrapper += " || '%'"; break; default: break; } } } else if (expression.Arguments.Count > 1 && expression.Arguments[1] is MemberExpression memberExpression) { SqlExpressionProvider.Where(memberExpression, sqlWrapper); sqlWrapper += " IN "; SqlExpressionProvider.In(expression.Arguments[0], sqlWrapper); } }