diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAs.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAs.cs new file mode 100644 index 000000000..2ea737768 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAs.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; + +namespace SqlSugar +{ + public class SubAs : ISubOperation + { + public bool HasWhere + { + get; set; + } + + public string Name + { + get + { + return "AS"; + } + } + + public Expression Expression + { + get; set; + } + + + public int Sort + { + get + { + return 200; + } + } + + public ExpressionContext Context + { + get; set; + } + + public string GetValue(Expression expression = null) + { + var exp = expression as MethodCallExpression; + var expString= SubTools.GetMethodValue(this.Context, exp.Arguments[0], ResolveExpressType.WhereSingle)?.Trim(); + var result = this.Context.Parameters.First(it => it.ParameterName == expString).Value+""; + return "$SubAs:"+result; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs index 3807b861c..8bbf94830 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; +using System.Text.RegularExpressions; namespace SqlSugar { @@ -16,6 +17,7 @@ namespace SqlSugar { List allMethods = new List(); private ExpressionContext context = null; + private string subKey = "$SubAs:"; private bool hasWhere; public SubResolve(MethodCallExpression expression, ExpressionContext context, Expression oppsiteExpression) { @@ -85,14 +87,32 @@ namespace SqlSugar currentExpression = addItem; } } - public string GetSql() { List subItems = GetSubItems(); - var sql = string.Join(UtilConstants.Space, subItems); + var sqlItems = subItems.Where(it => !it.StartsWith(subKey)).ToList(); + var asItems = subItems.Where(it => it.StartsWith(subKey)).ToList(); + if (asItems.Any()) + { + GetSubAs(sqlItems, asItems); + } + var sql = string.Join(UtilConstants.Space, sqlItems); return this.context.DbMehtods.Pack(sql); } + private void GetSubAs(List sqlItems, List asItems) + { + for (int i = 0; i < sqlItems.Count; i++) + { + if (sqlItems[i].StartsWith("FROM " + this.context.SqlTranslationLeft)) + { + var asName = this.context.GetTranslationTableName(asItems.First().Replace(subKey, ""), false); + var repKey = $"\\{this.context.SqlTranslationLeft}.+\\{this.context.SqlTranslationRight}"; + sqlItems[i] = Regex.Replace(sqlItems[i], repKey, asName); + } + } + } + private List GetSubItems() { var isubList = this.allMethods.Select(exp => diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs index 879700a0e..a52a3c18f 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs @@ -31,7 +31,8 @@ namespace SqlSugar new SubAvg(){ Context=Context }, new SubOrderBy(){ Context=Context }, new SubOrderByDesc(){ Context=Context }, - new SubGroupBy(){ Context=Context} + new SubGroupBy(){ Context=Context}, + new SubAs(){Context=Context} }; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs index 67ce6cd53..c570916b4 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs @@ -10,6 +10,10 @@ namespace SqlSugar public class Subqueryable where T : class, new() { + public Subqueryable AS(string tableName) + { + return this; + } public Subqueryable InnerJoin(Func expression) { return this; diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index b88839b1a..57426e281 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -88,6 +88,7 @@ +