diff --git a/OrmTest/UnitTest/Query/SelectQuery.cs b/OrmTest/UnitTest/Query/SelectQuery.cs index 5f49ed324..20e359627 100644 --- a/OrmTest/UnitTest/Query/SelectQuery.cs +++ b/OrmTest/UnitTest/Query/SelectQuery.cs @@ -35,16 +35,29 @@ namespace OrmTest.UnitTest Console.WriteLine(sql + " " + pars); }; - var listx = db.Queryable((st, st2) => new object[] { + var l1 = db.Queryable((st, st2) => new object[] { JoinType.Left,st.Id==st2.Id }) .Where(st => st.Id > 0) - .Select((st, st2) => new {stid = st.Id, scId = st2.Id,xx=st }).ToList(); - return; - var list = db.Queryable((st, st2) => new object[] { + .Select((st, st2) => new {stid = st.Id, scId = st2.Id,xx=st }).ToSql(); + + base.Check("SELECT [st].[Id] AS [stid] , [st2].[Id] AS [scId] , [st].[Id] AS [xx_Id] , [st].[Name] AS [xx_Name] FROM [School] st Left JOIN School st2 ON ( [st].[Id] = [st2].[Id] ) WHERE ( [st].[Id] > @Id0 )" + , new List() { + new SugarParameter("@Id0",0) + },l1.Key,l1.Value, "l1错误"); + + var l2 = db.Queryable((st, st2) => new object[] { JoinType.Left,st.Id==st2.Id - }).Where((st, sc) => st.Id > 0) - .Select(st => new ViewModelStudent { School = st }).ToList(); + }).Where((st, st2) => st2.Id > 2) + .Select(st => new ViewModelStudent { School = st }).ToSql(); + + base.Check("SELECT [st].[Id] AS [School_Id] , [st].[Name] AS [School_Name] FROM [School] st Left JOIN School st2 ON ( [st].[Id] = [st2].[Id] ) WHERE ( [st2].[Id] > @Id0 )", + new List() { new SugarParameter("@Id0", 2) }, + l2.Key, + l2.Value, + "l2报错" + ); + var list2 = db.Queryable() .Where(st => st.Id > 0) diff --git a/SqlSugar/Abstract/QueryableProvider/QueryableAccessory.cs b/SqlSugar/Abstract/QueryableProvider/QueryableAccessory.cs index 24ba017bb..29af3a7af 100644 --- a/SqlSugar/Abstract/QueryableProvider/QueryableAccessory.cs +++ b/SqlSugar/Abstract/QueryableProvider/QueryableAccessory.cs @@ -10,6 +10,7 @@ namespace SqlSugar public class QueryableAccessory { protected List _Pars; + protected ILambdaExpressions _LambdaExpressions; protected List BasePars { get @@ -32,27 +33,6 @@ namespace SqlSugar _Pars = new List(); _Pars.AddRange(pars); } - protected void Where(Expression expression,SqlSugarClient context,ISqlBuilder builder) - { - ResolveExpressType type = ResolveExpressType.WhereSingle; - if (builder.LambadaQueryBuilder.JoinQueryInfos.IsValuable()) - { - type = ResolveExpressType.WhereMultiple; - } - ILambdaExpressions resolveExpress = context.LambdaExpressions; - resolveExpress.Resolve(expression, type); - BasePars.AddRange(resolveExpress.Parameters); - builder.LambadaQueryBuilder.WhereInfos.Add(builder.AppendWhereOrAnd(builder.LambadaQueryBuilder.WhereInfos.IsNullOrEmpty(),resolveExpress.Result.GetResultString())); - resolveExpress.Clear(); - } - - protected void Where(string whereString, object whereObj, SqlSugarClient context, ISqlBuilder builder) - { - var SqlBuilder = builder; - var whereValue = SqlBuilder.LambadaQueryBuilder.WhereInfos; - whereValue.Add(SqlBuilder.AppendWhereOrAnd(whereValue.Count == 0, whereString)); - this.AddPars(whereObj, context); - } protected void SetSelectType(SqlSugarClient context,ISqlBuilder builder) { diff --git a/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 0e1946c02..16067a44f 100644 --- a/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -9,7 +9,7 @@ using System.Text.RegularExpressions; namespace SqlSugar { - public partial class QueryableProvider : QueryableAccessory, ISugarQueryable + public partial class QueryableProvider : QueryableAccessory, ISugarQueryable { public SqlSugarClient Context { get; set; } public IDb Db { get { return Context.Database; } } @@ -56,45 +56,47 @@ namespace SqlSugar public virtual ISugarQueryable Where(Expression> expression) { - base.Where(expression,this.Context, this.SqlBuilder); + this._Where(expression); return this; } public ISugarQueryable Where(string whereString, object whereObj = null) { - base.Where(whereString, whereObj, this.Context, this.SqlBuilder); + this.Where(whereString, whereObj); return this; } public ISugarQueryable Where(string whereString, object whereObj = null) { - base.Where(whereString, whereObj, this.Context, this.SqlBuilder); + var whereValue = SqlBuilder.LambadaQueryBuilder.WhereInfos; + whereValue.Add(SqlBuilder.AppendWhereOrAnd(whereValue.Count == 0, whereString)); + this.AddPars(whereObj, this.Context); return this; } public ISugarQueryable Where(Expression> expression) { - base.Where(expression, this.Context, this.SqlBuilder); + this._Where(expression); return this; } - public ISugarQueryable Where(Expression> expression) + public ISugarQueryable Where(Expression> expression) { - base.Where(expression, this.Context, this.SqlBuilder); + this._Where(expression); return this; } public ISugarQueryable Where(Expression> expression) { - base.Where(expression, this.Context, this.SqlBuilder); + this._Where(expression); return this; } - public ISugarQueryable Where(Expression> expression) + public ISugarQueryable Where(Expression> expression) { - base.Where(expression, this.Context, this.SqlBuilder); + this._Where(expression); return this; } - public ISugarQueryable Where(Expression> expression) + public ISugarQueryable Where(Expression> expression) { - base.Where(expression, this.Context, this.SqlBuilder); + this._Where(expression); return this; } - public virtual ISugarQueryable WhereIF(bool isWhere,Expression> expression) + public virtual ISugarQueryable WhereIF(bool isWhere, Expression> expression) { if (!isWhere) return this; Where(expression); @@ -103,13 +105,13 @@ namespace SqlSugar public ISugarQueryable WhereIF(bool isWhere, string whereString, object whereObj = null) { if (!isWhere) return this; - base.Where(whereString, whereObj, this.Context, this.SqlBuilder); + this.Where(whereString, whereObj); return this; } - public ISugarQueryable WhereIF(bool isWhere, string whereString, object whereObj = null) + public ISugarQueryable WhereIF(bool isWhere, string whereString, object whereObj = null) { if (!isWhere) return this; - base.Where(whereString, whereObj, this.Context, this.SqlBuilder); + this.Where(whereString, whereObj); return this; } public ISugarQueryable WhereIF(bool isWhere, Expression> expression) @@ -118,13 +120,13 @@ namespace SqlSugar this.Where(expression); return this; } - public ISugarQueryable WhereIF(bool isWhere, Expression> expression) + public ISugarQueryable WhereIF(bool isWhere, Expression> expression) { if (!isWhere) return this; this.Where(expression); return this; } - public ISugarQueryable WhereIF(bool isWhere, Expression> expression) + public ISugarQueryable WhereIF(bool isWhere, Expression> expression) { if (!isWhere) return this; this.Where(expression); @@ -136,7 +138,7 @@ namespace SqlSugar this.Where(expression); return this; } - public ISugarQueryable WhereIF(bool isWhere, Expression> expression) + public ISugarQueryable WhereIF(bool isWhere, Expression> expression) { if (!isWhere) return this; this.Where(expression); @@ -258,35 +260,35 @@ namespace SqlSugar throw new NotImplementedException(); } - public ISugarQueryable Select(Expression> expression) + public ISugarQueryable Select(Expression> expression) { return SelectMehtod(expression); } - public ISugarQueryable Select(Expression> expression) + public ISugarQueryable Select(Expression> expression) { return SelectMehtod(expression); } - public ISugarQueryable Select(Expression> expression) + public ISugarQueryable Select(Expression> expression) { return SelectMehtod(expression); } - public ISugarQueryable Select(Expression> expression) + public ISugarQueryable Select(Expression> expression) { return SelectMehtod(expression); } - public ISugarQueryable Select(Expression> expression) + public ISugarQueryable Select(Expression> expression) { return SelectMehtod(expression); } - public ISugarQueryable Select(Expression> expression) + public ISugarQueryable Select(Expression> expression) { return SelectMehtod(expression); } - public ISugarQueryable Select(Expression> expression) + public ISugarQueryable Select(Expression> expression) { return SelectMehtod(expression); } @@ -346,8 +348,8 @@ namespace SqlSugar public List ToList() { - string sql = SqlBuilder.LambadaQueryBuilder.ToSqlString(); - using (var dataReader = this.Db.GetDataReader(sql, this.Pars.ToArray())) + var sqlObj =this.ToSql(); + using (var dataReader = this.Db.GetDataReader(sqlObj.Key, sqlObj.Value.ToArray())) { var reval = this.Bind.DataReaderToList(typeof(T), dataReader, SqlBuilder.LambadaQueryBuilder.SelectCacheKey); return reval; @@ -368,9 +370,10 @@ namespace SqlSugar throw new NotImplementedException(); } - public KeyValuePair> ToSql() + public KeyValuePair> ToSql() { - throw new NotImplementedException(); + string sql = SqlBuilder.LambadaQueryBuilder.ToSqlString(); + return new KeyValuePair>(sql, this.Pars); } public DataTable ToDataTable() @@ -398,6 +401,23 @@ namespace SqlSugar throw new NotImplementedException(); } + #region 私有方法 + protected void _Where(Expression expression) + { + ResolveExpressType type = ResolveExpressType.WhereSingle; + if (SqlBuilder.LambadaQueryBuilder.JoinQueryInfos.IsValuable()) + { + type = ResolveExpressType.WhereMultiple; + } + ILambdaExpressions resolveExpress = this.SqlBuilder.LambadaQueryBuilder.LambdaExpressions; + resolveExpress.Resolve(expression, type); + BasePars.AddRange(resolveExpress.Parameters); + SqlBuilder.LambadaQueryBuilder.WhereInfos.Add(SqlBuilder.AppendWhereOrAnd(SqlBuilder.LambadaQueryBuilder.WhereInfos.IsNullOrEmpty(), resolveExpress.Result.GetResultString())); + resolveExpress.Clear(); + } + #endregion + + } } diff --git a/SqlSugar/Abstract/SqlBuilderProvider/DMLBuilder/LambadaQueryBuilder.cs b/SqlSugar/Abstract/SqlBuilderProvider/DMLBuilder/LambadaQueryBuilder.cs index b2f1623ae..ad9b803a9 100644 --- a/SqlSugar/Abstract/SqlBuilderProvider/DMLBuilder/LambadaQueryBuilder.cs +++ b/SqlSugar/Abstract/SqlBuilderProvider/DMLBuilder/LambadaQueryBuilder.cs @@ -8,11 +8,6 @@ namespace SqlSugar { public abstract class LambadaQueryBuilder : IDMLBuilder { - public LambadaQueryBuilder() - { - - } - private List _QueryPars; private List _JoinQueryInfos; private List _WhereInfos; @@ -20,6 +15,7 @@ namespace SqlSugar public StringBuilder Sql { get; set; } public SqlSugarClient Context { get; set; } + public ILambdaExpressions LambdaExpressions { get; set; } public ISqlBuilder Builder { get; set; } public int? Skip { get; set; } @@ -85,7 +81,7 @@ namespace SqlSugar public virtual string GetSelectValueByExpression() { var expression = this.SelectValue as Expression; - ILambdaExpressions resolveExpress = this.Context.LambdaExpressions; + ILambdaExpressions resolveExpress = this.LambdaExpressions; var isSingle= Builder.LambadaQueryBuilder.JoinQueryInfos.IsValuable(); resolveExpress.JoinQueryInfos = Builder.LambadaQueryBuilder.JoinQueryInfos; resolveExpress.MappingColumns = Context.MappingColumns; diff --git a/SqlSugar/Interface/IQueryable.cs b/SqlSugar/Interface/IQueryable.cs index 50ce9fac9..2a8876b17 100644 --- a/SqlSugar/Interface/IQueryable.cs +++ b/SqlSugar/Interface/IQueryable.cs @@ -84,7 +84,7 @@ namespace SqlSugar string ToJsonPage(int pageIndex, int pageSize); string ToJsonPage(int pageIndex, int pageSize, ref int pageCount); - KeyValuePair> ToSql(); + KeyValuePair> ToSql(); DataTable ToDataTable(); diff --git a/SqlSugar/SqlSugarClient.cs b/SqlSugar/SqlSugarClient.cs index d7be384ac..f714722e7 100644 --- a/SqlSugar/SqlSugarClient.cs +++ b/SqlSugar/SqlSugarClient.cs @@ -90,23 +90,7 @@ namespace SqlSugar return _Ado; } } - /// - /// Lambda Expressions operation - /// - public virtual ILambdaExpressions LambdaExpressions - { - get - { - if (_LambdaExpressions == null) - { - var reval = InstanceFactory.GetLambdaExpressions(base.CurrentConnectionConfig); - reval.Context = this; - _LambdaExpressions = reval; - return reval; - } - return _LambdaExpressions; - } - } + /// /// Lambda Query operation /// @@ -120,6 +104,7 @@ namespace SqlSugar reval.SqlBuilder.LambadaQueryBuilder.Builder = sqlBuilder; reval.SqlBuilder.Context = reval.SqlBuilder.LambadaQueryBuilder.Context = this; reval.SqlBuilder.LambadaQueryBuilder.EntityName = typeof(T).Name; + reval.SqlBuilder.LambadaQueryBuilder.LambdaExpressions = InstanceFactory.GetLambdaExpressions(base.CurrentConnectionConfig); return reval; }