- 修复 UseGenerateCommandParameterWithLambda(true) 时子语句的参数没整合到主语句;#231

- 增加 ISelect.RawJoin 方法以便实现 Outer Apply 查询;#200
This commit is contained in:
28810 2020-03-12 15:49:08 +08:00
parent e132133e62
commit c468c65ba5
6 changed files with 70 additions and 55 deletions

View File

@ -131,6 +131,11 @@ namespace FreeSql.Tests
[Fact]
public void Test03()
{
var itemId = 1;
var edi = g.sqlite.Select<Edi>()
.Where(a => g.sqlite.Select<EdiItem>().Where(b => b.Id == itemId).Any())
.First(a => a); //#231
var lksdjkg1 = g.sqlite.Select<Edi>()
.AsQueryable().Where(a => a.Id > 0).ToList();

View File

@ -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命令对象在执行前

View File

@ -1226,6 +1226,14 @@
<param name="parms">参数</param>
<returns></returns>
</member>
<member name="M:FreeSql.ISelect0`2.RawJoin(System.String)">
<summary>
在 JOIN 位置插入 SQL 内容<para></para>
如:.RawJoin("OUTER APPLY ( select id from t2 ) b")
</summary>
<param name="sql"></param>
<returns></returns>
</member>
<member name="M:FreeSql.ISelect0`2.Where(System.String,System.Object)">
<summary>
原生sql语法条件Where("id = ?id", new { id = 1 })
@ -2953,6 +2961,40 @@
<param name="end"></param>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalExpressionCall.Contains``2(System.Collections.Generic.IEnumerable{System.ValueTuple{``0,``1}},``0,``1)">
<summary>
C#:从元组集合中查找 exp1, exp2 是否存在<para></para>
SQL <para></para>
exp1 = that[0].Item1 and exp2 = that[0].Item2 OR <para></para>
exp1 = that[1].Item1 and exp2 = that[1].Item2 OR <para></para>
... <para></para>
注意:当 that 为 null 或 empty 时,返回 1=0
</summary>
<typeparam name="T1"></typeparam>
<typeparam name="T2"></typeparam>
<param name="that"></param>
<param name="exp1"></param>
<param name="exp2"></param>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalExpressionCall.Contains``3(System.Collections.Generic.IEnumerable{System.ValueTuple{``0,``1,``2}},``0,``1,``2)">
<summary>
C#:从元组集合中查找 exp1, exp2, exp2 是否存在<para></para>
SQL <para></para>
exp1 = that[0].Item1 and exp2 = that[0].Item2 and exp3 = that[0].Item3 OR <para></para>
exp1 = that[1].Item1 and exp2 = that[1].Item2 and exp3 = that[1].Item3 OR <para></para>
... <para></para>
注意:当 that 为 null 或 empty 时,返回 1=0
</summary>
<typeparam name="T1"></typeparam>
<typeparam name="T2"></typeparam>
<typeparam name="T3"></typeparam>
<param name="that"></param>
<param name="exp1"></param>
<param name="exp2"></param>
<param name="exp3"></param>
<returns></returns>
</member>
<member name="M:FreeSqlGlobalExtensions.Distance(System.Drawing.Point,System.Drawing.Point)">
<summary>
测量两个经纬度的距离,返回单位:米
@ -3217,49 +3259,3 @@
</member>
</members>
</doc>
Œå®Œæˆ<EFBFBD>(å<EFBFBD>¯èƒ½ï¼‰è¢«å…¶ä»çº¿ç¨äºåŠ¡è‡ªåŠ¨æ<EFBFBD><EFBFBD>交
</summary>
<param name="handler">事务体 () => {}</param>
</member>
<member name="M:IFreeSql.Transaction(System.TimeSpan,System.Action)">
<summary>
å¼€å<E282AC>¯äºåŠ¡ï¼ˆä¸<C3A4>支æŒ<C3A6>弿­¥ï¼‰
</summary>
<param name="timeout">超时,未执行完æˆ<EFBFBD>(å<EFBFBD>¯èƒ½ï¼‰è¢«å…¶ä»çº¿ç¨äºåŠ¡è‡ªåŠ¨æ<EFBFBD><EFBFBD>交</param>
<param name="handler">事务体 () => {}</param>
</member>
<member name="M:IFreeSql.Transaction(System.Data.IsolationLevel,System.TimeSpan,System.Action)">
<summary>
å¼€å<E282AC>¯äºåŠ¡ï¼ˆä¸<C3A4>支æŒ<C3A6>弿­¥ï¼‰
</summary>
<param name="isolationLevel"></param>
<param name="handler">事务体 () => {}</param>
<param name="timeout">超时,未执行完æˆ<EFBFBD>(å<EFBFBD>¯èƒ½ï¼‰è¢«å…¶ä»çº¿ç¨äºåŠ¡è‡ªåŠ¨æ<EFBFBD><EFBFBD>交</param>
</member>
<member name="P:IFreeSql.Ado">
<summary>
æ•°æ<C2B0>®åº“访问对象
</summary>
</member>
<member name="P:IFreeSql.Aop">
<summary>
所有拦截方法都在这里
</summary>
</member>
<member name="P:IFreeSql.CodeFirst">
<summary>
CodeFirst 模å¼<C3A5>å¼€å<E282AC>ç¸å…³æ¹æ³•
</summary>
</member>
<member name="P:IFreeSql.DbFirst">
<summary>
DbFirst 模å¼<C3A5>å¼€å<E282AC>ç¸å…³æ¹æ³•
</summary>
</member>
<member name="P:IFreeSql.GlobalFilter">
<summary>
全局过滤设置,å<C592>¯é»˜è®¤é™„加为 Select/Update/Delete æ<>¡ä»¶
</summary>
</member>
</members>
</doc>

View File

@ -226,6 +226,13 @@ namespace FreeSql
/// <param name="parms">参数</param>
/// <returns></returns>
TSelect RightJoin(string sql, object parms = null);
/// <summary>
/// 在 JOIN 位置插入 SQL 内容<para></para>
/// 如:.RawJoin("OUTER APPLY ( select id from t2 ) b")
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
TSelect RawJoin(string sql);
/// <summary>
/// 原生sql语法条件Where("id = ?id", new { id = 1 })

View File

@ -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<SelectTableInfo>;
//fsqltables[0].Alias = $"{tsc._tables[0].Alias}_{fsqltables[0].Alias}";
if (fsqltables != tsc._tables)

View File

@ -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;