diff --git a/Src/Asp.Net/OracleTest/Demos/1_Query.cs b/Src/Asp.Net/OracleTest/Demos/1_Query.cs index 0bb0c3374..f9ba2c0fc 100644 --- a/Src/Asp.Net/OracleTest/Demos/1_Query.cs +++ b/Src/Asp.Net/OracleTest/Demos/1_Query.cs @@ -27,6 +27,7 @@ namespace OrmTest.Demo Enum(); Simple(); SqlTest(); + Subqueryable(); } private static void SqlTest() @@ -34,7 +35,55 @@ namespace OrmTest.Demo var db = GetInstance(); var x = db.Ado.ExecuteCommand("select '@id' as id from student where id=@id",new { id=1}); } + private static void Subqueryable() + { + var db = GetInstance(); + var i = 0; + var getAll11 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Max(s => s.Id) == i).ToList(); + var getAll12 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Max(s => s.Id) == 1).ToList(); + var getAll7 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Any()).ToList(); + var getAll9 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Count() == 1).ToList(); + + //var getAll10 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).OrderBy(s => s.Id).Select(s => s.Id) == 1).ToList(); + //var getAll14 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).OrderByDesc(s => s.Id).Select(s => s.Id) == 1).ToList(); + + var getAll8 = db.Queryable().Where(it => SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Where(s => s.Name == it.Name).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 + }) + .Where(st => st.Id == SqlFunc.Subqueryable().Where(s => s.Id == st.Id).Select(s => s.Id)) + .ToList(); + + 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) + }) + .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(); + + var getAll5 = db.Queryable().Select(it => + new Student + { + Name = it.Name, + Id = SqlFunc.Subqueryable().Where(s => s.Id == it.Id).Select(s => s.Id) + }).ToList(); + + } private static void Simple() { //SqlSugarClient diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/ISubOperation.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/ISubOperation.cs index b0848a862..432f67b93 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/ISubOperation.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/ISubOperation.cs @@ -13,5 +13,6 @@ namespace SqlSugar string GetValue(Expression expression); int Sort { get; } Expression Expression { get; set; } + bool HasWhere { get; set; } } } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs index e173876ca..05166602d 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAnd.cs @@ -31,6 +31,11 @@ namespace SqlSugar get;set; } + public bool HasWhere + { + get; set; + } + public string GetValue(Expression expression) { var exp = expression as MethodCallExpression; diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs index 926791737..476c69caf 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAny.cs @@ -18,6 +18,11 @@ namespace SqlSugar get;set; } + public bool HasWhere + { + get;set; + } + public string Name { get diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAvg.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAvg.cs index 22daab138..00187392a 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAvg.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubAvg.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubAvg: ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubBegin.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubBegin.cs index 9ddcf1c46..879d60fc2 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubBegin.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubBegin.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubBegin : ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubCount.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubCount.cs index 199c0f744..bbb1cd161 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubCount.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubCount.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubCount: ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubFromTable.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubFromTable.cs index f9f157965..f2d7883b3 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubFromTable.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubFromTable.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubFromTable : ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubGroupBy.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubGroupBy.cs index 410e9687a..825014103 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubGroupBy.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubGroupBy.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubGroupBy : ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get { return "GroupBy"; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs index a770cd10c..29be63a41 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubLeftBracket.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubLeftBracket : ISubOperation { + public bool HasWhere + { + get; set; + } + public ExpressionContext Context { get;set; diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubMax.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubMax.cs index 12c20bc5d..59fa5c51d 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubMax.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubMax.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubMax:ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubMin.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubMin.cs index 32ae0285b..5d51fbb3f 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubMin.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubMin.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubMin: ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs index b08db473d..7805505db 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubNotAny.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubNotAny : ISubOperation { + public bool HasWhere + { + get; set; + } + public ExpressionContext Context { get;set; diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs index 993790580..d158d2e1f 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubOrderBy.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubOrderBy : ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get { return "OrderBy"; } @@ -33,6 +38,10 @@ namespace SqlSugar public string GetValue(Expression expression) { + if (this.Context is OracleExpressionContext) + { + throw new Exception("Oracle Subquery can't OrderBy"); + } var exp = expression as MethodCallExpression; var argExp = exp.Arguments[0]; var result = "ORDER BY " + SubTools.GetMethodValue(this.Context, argExp, ResolveExpressType.FieldSingle); @@ -43,6 +52,11 @@ namespace SqlSugar } public class SubOrderByDesc : ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get { return "OrderByDesc"; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs index cb8f22287..970d3a6df 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubRightBracket.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubRightBracket : ISubOperation { + public bool HasWhere + { + get; set; + } + public ExpressionContext Context { get;set; diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs index 8ac2f9979..d2b853feb 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelect.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubSelect : ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs index b34236c43..a60e6aff3 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSelectDefault.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubSelectDefault : ISubOperation { + public bool HasWhere + { + get; set; + } + public ExpressionContext Context { get;set; diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSum.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSum.cs index 16563bba8..00b212cad 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSum.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubSum.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubSum:ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubTop.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubTop.cs index 6432c3329..5b03fb18f 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubTop.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubTop.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubTop : ISubOperation { + public bool HasWhere + { + get; set; + } + public ExpressionContext Context { get; set; @@ -34,6 +39,10 @@ namespace SqlSugar { return 150; } + else if (this.Context is OracleExpressionContext) { + + return 401; + } else { return 490; @@ -50,7 +59,7 @@ namespace SqlSugar } else if (this.Context is OracleExpressionContext) { - return "ROWNUM=1"; + return (HasWhere?"AND":"WHERE")+ " ROWNUM=1"; } else { diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs index 3410ad4f0..5c0e77fc7 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/Items/SubWhere.cs @@ -8,6 +8,11 @@ namespace SqlSugar { public class SubWhere: ISubOperation { + public bool HasWhere + { + get; set; + } + public string Name { get { return "Where"; } diff --git a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs index 6fc3f0039..8fdb704ce 100644 --- a/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs +++ b/Src/Asp.Net/SqlSugar/ExpressionsToSql/Subquery/SubResolve.cs @@ -99,8 +99,10 @@ namespace SqlSugar isubList.Add(new SubSelectDefault()); } isubList = isubList.OrderBy(it => it.Sort).ToList(); + var isHasWhere = isubList.Where(it => it is SubWhere).Any(); List result = isubList.Select(it => { + it.HasWhere = isHasWhere; return it.GetValue(it.Expression); }).ToList(); return result;