- 修复 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><EFBFBD><EFBFBD>嚗㕑◤<EFBFBD><EFBFBD>蝥輻<EFBFBD>鈭见𦛚<EFBFBD>芸𢆡<EFBFBD>𣂷漱
</summary>
<param name="handler">鈭见𦛚雿<EFBFBD> () => {}</param>
</member>
<member name="M:IFreeSql.Transaction(System.TimeSpan,System.Action)">
<summary>
<><E69298><EFBFBD><E887AD><EFBFBD>銝齿𣈲<E9BDBF><F0A388B2><EFBFBD>甇伐<E79487>
</summary>
<param name="timeout"><EFBFBD>𧒄嚗峕𧊋<EFBFBD><EFBFBD>摰峕<EFBFBD><EFBFBD><EFBFBD><EFBFBD>鋡怠<EFBFBD>隞𣇉瑪蝔衤<EFBFBD><EFBFBD>∟䌊<EFBFBD><EFBFBD><EFBFBD></param>
<param name="handler">鈭见𦛚雿<EFBFBD> () => {}</param>
</member>
<member name="M:IFreeSql.Transaction(System.Data.IsolationLevel,System.TimeSpan,System.Action)">
<summary>
<><E69298><EFBFBD><E887AD><EFBFBD>銝齿𣈲<E9BDBF><F0A388B2><EFBFBD>甇伐<E79487>
</summary>
<param name="isolationLevel"></param>
<param name="handler">鈭见𦛚雿<EFBFBD> () => {}</param>
<param name="timeout"><EFBFBD>𧒄嚗峕𧊋<EFBFBD><EFBFBD>摰峕<EFBFBD><EFBFBD><EFBFBD><EFBFBD>鋡怠<EFBFBD>隞𣇉瑪蝔衤<EFBFBD><EFBFBD>∟䌊<EFBFBD><EFBFBD><EFBFBD></param>
</member>
<member name="P:IFreeSql.Ado">
<summary>
<20>唳旿摨栞挪<E6A09E>桀笆鞊<E7AC86>
</summary>
</member>
<member name="P:IFreeSql.Aop">
<summary>
<20><><EFBFBD>㗇㜃<E39787>芣䲮瘜閖<E7989C><E99696><EFBFBD><E588BB><EFBFBD>
</summary>
</member>
<member name="P:IFreeSql.CodeFirst">
<summary>
CodeFirst 璅<E79285><EFBFBD><E69298>𤑳㮾<F0A491B3>單䲮瘜<E4B2AE>
</summary>
</member>
<member name="P:IFreeSql.DbFirst">
<summary>
DbFirst 璅<E79285><EFBFBD><E69298>𤑳㮾<F0A491B3>單䲮瘜<E4B2AE>
</summary>
</member>
<member name="P:IFreeSql.GlobalFilter">
<summary>
<20><EFBFBD><EFBFBD>誘霈曄蔭嚗<E894AD>虾暺䁅恕<E48185><E68195><EFBFBD><EFBFBD> Select/Update/Delete <20>∩辣
</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;