diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs index dc3ae2e0..d7538507 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs @@ -131,6 +131,11 @@ namespace FreeSql.Tests [Fact] public void Test03() { + var itemId = 1; + var edi = g.sqlite.Select() + .Where(a => g.sqlite.Select().Where(b => b.Id == itemId).Any()) + .First(a => a); //#231 + var lksdjkg1 = g.sqlite.Select() .AsQueryable().Where(a => a.Id > 0).ToList(); diff --git a/FreeSql.Tests/FreeSql.Tests/g.cs b/FreeSql.Tests/FreeSql.Tests/g.cs index 985eae8b..8a149a24 100644 --- a/FreeSql.Tests/FreeSql.Tests/g.cs +++ b/FreeSql.Tests/FreeSql.Tests/g.cs @@ -83,7 +83,7 @@ public class g // return conn; //}) .UseAutoSyncStructure(true) - //.UseGenerateCommandParameterWithLambda(true) + .UseGenerateCommandParameterWithLambda(true) .UseLazyLoading(true) .UseMonitorCommand( cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前 diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index ee325756..1efa0813 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1226,6 +1226,14 @@ 参数 + + + 在 JOIN 位置插入 SQL 内容 + 如:.RawJoin("OUTER APPLY ( select id from t2 ) b") + + + + 原生sql语法条件,Where("id = ?id", new { id = 1 }) @@ -2953,6 +2961,40 @@ + + + C#:从元组集合中查找 exp1, exp2 是否存在 + SQL: + exp1 = that[0].Item1 and exp2 = that[0].Item2 OR + exp1 = that[1].Item1 and exp2 = that[1].Item2 OR + ... + 注意:当 that 为 null 或 empty 时,返回 1=0 + + + + + + + + + + + C#:从元组集合中查找 exp1, exp2, exp2 是否存在 + SQL: + exp1 = that[0].Item1 and exp2 = that[0].Item2 and exp3 = that[0].Item3 OR + exp1 = that[1].Item1 and exp2 = that[1].Item2 and exp3 = that[1].Item3 OR + ... + 注意:当 that 为 null 或 empty 时,返回 1=0 + + + + + + + + + + 测量两个经纬度的距离,返回单位:米 @@ -3217,49 +3259,3 @@ -完成(可能)被其他线程事务自动提交 - - 事务体 () => {} - - - - 开启事务(不支持异步) - - 超时,未执行完成(可能)被其他线程事务自动提交 - 事务体 () => {} - - - - 开启事务(不支持异步) - - - 事务体 () => {} - 超时,未执行完成(可能)被其他线程事务自动提交 - - - - 数据库访问对象 - - - - - 所有拦截方法都在这里 - - - - - CodeFirst 模式开发相关方法 - - - - - DbFirst 模式开发相关方法 - - - - - 全局过滤设置,可默认附加为 Select/Update/Delete 条件 - - - - diff --git a/FreeSql/Interface/Curd/ISelect/ISelect0.cs b/FreeSql/Interface/Curd/ISelect/ISelect0.cs index 363d8249..b42fc3c1 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect0.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect0.cs @@ -226,6 +226,13 @@ namespace FreeSql /// 参数 /// TSelect RightJoin(string sql, object parms = null); + /// + /// 在 JOIN 位置插入 SQL 内容 + /// 如:.RawJoin("OUTER APPLY ( select id from t2 ) b") + /// + /// + /// + TSelect RawJoin(string sql); /// /// 原生sql语法条件,Where("id = ?id", new { id = 1 }) diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 2138f213..64bed1e7 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -808,6 +808,8 @@ namespace FreeSql.Internal if (fsqlType == null) break; if (exp3.Method.Name != "ToList") fsqlType.GetField("_limit", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(fsql, 1); + if (tsc.dbParams != null) + fsqlType.GetField("_params", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(fsql, tsc.dbParams); fsqltables = fsqlType.GetField("_tables", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(fsql) as List; //fsqltables[0].Alias = $"{tsc._tables[0].Alias}_{fsqltables[0].Alias}"; if (fsqltables != tsc._tables) diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 07f7267e..d0c9807a 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -244,6 +244,19 @@ namespace FreeSql.Internal.CommonProvider if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms)); return this as TSelect; } + public TSelect RightJoin(string sql, object parms = null) + { + if (string.IsNullOrEmpty(sql)) return this as TSelect; + _join.Append(" \r\nRIGHT JOIN ").Append(sql); + if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms)); + return this as TSelect; + } + public TSelect RawJoin(string sql) + { + if (string.IsNullOrEmpty(sql)) return this as TSelect; + _join.Append(" \r\n").Append(sql); + return this as TSelect; + } public TSelect Limit(int limit) { @@ -273,14 +286,6 @@ namespace FreeSql.Internal.CommonProvider return this.Limit(pageSize) as TSelect; } - public TSelect RightJoin(string sql, object parms = null) - { - if (string.IsNullOrEmpty(sql)) return this as TSelect; - _join.Append(" \r\nRIGHT JOIN ").Append(sql); - if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms)); - return this as TSelect; - } - public TSelect Skip(int offset) { _skip = offset;