From 18adc0624346bc02bbc2db94631916c32778c86b Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Sun, 17 Sep 2017 00:29:48 +0800 Subject: [PATCH] Subquery --- Src/Asp.Net/SqlServerTest/Demos/1_Query.cs | 31 ++++++++++------ .../ExpressionsToSql/Subquery/Items/SubAny.cs | 4 +- .../Subquery/Items/SubLeftBracket.cs | 37 +++++++++++++++++++ .../Subquery/Items/SubNotAny.cs | 37 +++++++++++++++++++ .../Subquery/Items/SubRightBracket.cs | 37 +++++++++++++++++++ .../Subquery/Items/SubSelectDefault.cs | 36 ++++++++++++++++++ .../ExpressionsToSql/Subquery/SubResolve.cs | 9 ++++- .../ExpressionsToSql/Subquery/SubTools.cs | 1 + .../ExpressionsToSql/Subquery/Subquerable.cs | 5 +++ Src/Asp.Net/SqlSugar/SqlSugar.csproj | 4 ++ 10 files changed, 185 insertions(+), 16 deletions(-) create mode 100644 Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs create mode 100644 Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs create mode 100644 Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs create mode 100644 Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs diff --git a/Src/Asp.Net/SqlServerTest/Demos/1_Query.cs b/Src/Asp.Net/SqlServerTest/Demos/1_Query.cs index e64c5214e..94ad29bb6 100644 --- a/Src/Asp.Net/SqlServerTest/Demos/1_Query.cs +++ b/Src/Asp.Net/SqlServerTest/Demos/1_Query.cs @@ -33,9 +33,12 @@ namespace OrmTest.Demo private static void Subqueryable() { var db = GetInstance(); - var getAll1 = db.Queryable() - .Where(it => it.Id == SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Select(s => s.Id)) - .ToList(); + + var getAll7 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Any()).ToList(); + + var getAll8= db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).NotAny()).ToList(); + + var getAll1 = db.Queryable().Where(it => it.Id == SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Select(s => s.Id)).ToList(); var getAll2 = db.Queryable((st, sc) => new object[] { JoinType.Left,st.Id==sc.Id @@ -46,24 +49,28 @@ namespace OrmTest.Demo var getAll3 = db.Queryable((st, sc) => new object[] { JoinType.Left,st.Id==sc.Id }) - .Select(st=> - new { - name=st.Name, - id = SqlFunc.Subqueryable().Where(s => s.Id == st.Id).Select(s => s.Id) + .Select(st => + new + { + name = st.Name, + id = SqlFunc.Subqueryable().Where(s => s.Id == st.Id).Select(s => s.Id) }) .ToList(); var getAll4 = db.Queryable().Select(it => - new { - name = it.Name, - id = SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Select(s => s.Id) - }).ToList(); + new + { + name = it.Name, + id = SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Select(s => s.Id) + }).ToList(); var getAll5 = db.Queryable().Select(it => - new Student { + new Student + { Name = it.Name, Id = SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Select(s => s.Id) }).ToList(); + } private static void Async() diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs index 74132c483..7e65b4f83 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs @@ -25,13 +25,13 @@ namespace SqlSugar { get { - return 1000; + return 0; } } public string GetValue(ExpressionContext context, Expression expression) { - return ">0"; + return "EXISTS"; } } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs new file mode 100644 index 000000000..3b0b445aa --- /dev/null +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + public class SubLeftBracket : ISubOperation + { + public Expression Expression + { + get;set; + } + + public string Name + { + get + { + return "LeftBracket"; + } + } + + public int Sort + { + get + { + return 50; + } + } + + public string GetValue(ExpressionContext context, Expression expression) + { + return "("; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs new file mode 100644 index 000000000..a3e8e1672 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + public class SubNotAny : ISubOperation + { + public Expression Expression + { + get; set; + } + + public string Name + { + get + { + return "NotAny"; + } + } + + public int Sort + { + get + { + return 0; + } + } + + public string GetValue(ExpressionContext context, Expression expression) + { + return "NOT EXISTS"; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs new file mode 100644 index 000000000..450a99424 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + public class SubRightBracket : ISubOperation + { + public Expression Expression + { + get;set; + } + + public string Name + { + get + { + return "RightBracket"; + } + } + + public int Sort + { + get + { + return 500; + } + } + + public string GetValue(ExpressionContext context, Expression expression) + { + return ")"; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs new file mode 100644 index 000000000..3338b3972 --- /dev/null +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; + +namespace SqlSugar +{ + public class SubSelectDefault : ISubOperation + { + public Expression Expression + { + get;set; + } + + public string Name + { + get { + return "SelectDefault"; + } + } + + public int Sort + { + get + { + return 250; + } + } + + public string GetValue(ExpressionContext context, Expression expression) + { + return "*"; + } + } +} diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs index dc1ee5ac5..45c39a519 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs @@ -47,9 +47,14 @@ namespace SqlSugar var item = SubTools.SubItems.First(s => s.Name == methodName); item.Expression = exp; return item; - }) - .OrderBy(it => it.Sort).ToList(); + }).ToList(); isubList.Insert(0, new SubBegin()); + if (isubList.Any(it => it is SubAny||it is SubNotAny)) { + isubList.Add(new SubLeftBracket()); + isubList.Add(new SubRightBracket()); + isubList.Add(new SubSelectDefault()); + } + isubList= isubList.OrderBy(it => it.Sort).ToList(); List result = isubList.Select(it => { return it.GetValue(this.context, it.Expression); diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs index 9fbd43339..d02eb2e08 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubTools.cs @@ -14,6 +14,7 @@ namespace SqlSugar new SubSelect(), new SubWhere(), new SubAny(), + new SubNotAny(), new SubBegin(), new SubFromTable() }; diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs index 3fd640cb7..1ee720751 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Subquerable.cs @@ -31,6 +31,11 @@ namespace SqlSugar return default(bool); } + public bool NotAny() + { + return default(bool); + } + public bool Count() { return default(bool); diff --git a/Src/Asp.Net/SqlSugar/SqlSugar.csproj b/Src/Asp.Net/SqlSugar/SqlSugar.csproj index fc945b50f..190ef3bf2 100644 --- a/Src/Asp.Net/SqlSugar/SqlSugar.csproj +++ b/Src/Asp.Net/SqlSugar/SqlSugar.csproj @@ -73,10 +73,14 @@ + + + +