mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-04-22 18:52:50 +08:00
- 优化 IncludeMany 级联查询支持异步适配(之前是同步方式);
This commit is contained in:
parent
46dcd226ff
commit
8c770a3ffb
@ -4,7 +4,9 @@ using FreeSql.Extensions;
|
|||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Diagnostics;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace base_entity
|
namespace base_entity
|
||||||
@ -124,8 +126,8 @@ namespace base_entity
|
|||||||
ru1.RoleId = r2.Id;
|
ru1.RoleId = r2.Id;
|
||||||
await ru1.SaveAsync();
|
await ru1.SaveAsync();
|
||||||
|
|
||||||
var u1roles = User1.Select.IncludeMany(a => a.Roles).ToList();
|
var u1roles = await User1.Select.IncludeMany(a => a.Roles).ToListAsync();
|
||||||
var u1roles2 = User1.Select.Where(a => a.Roles.AsSelect().Any(b => b.Id == "xx")).ToList();
|
var u1roles2 = await User1.Select.Where(a => a.Roles.AsSelect().Any(b => b.Id == "xx")).ToListAsync();
|
||||||
|
|
||||||
}).Wait();
|
}).Wait();
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ namespace FreeSql
|
|||||||
public static void Initialization(IFreeSql fsql)
|
public static void Initialization(IFreeSql fsql)
|
||||||
{
|
{
|
||||||
_ormPriv = fsql;
|
_ormPriv = fsql;
|
||||||
_ormPriv.Aop.CurdBefore += (s, e) => Trace.WriteLine(e.Sql + "\r\n");
|
_ormPriv.Aop.CurdBefore += (s, e) => Trace.WriteLine($"\r\n线程{Thread.CurrentThread.ManagedThreadId}: {e.Sql}\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -110,6 +110,13 @@
|
|||||||
清空状态数据
|
清空状态数据
|
||||||
</summary>
|
</summary>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.DbSet`1.RemoveAsync(System.Linq.Expressions.Expression{System.Func{`0,System.Boolean}})">
|
||||||
|
<summary>
|
||||||
|
根据 lambda 条件删除数据
|
||||||
|
</summary>
|
||||||
|
<param name="predicate"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="M:FreeSql.DbSet`1.Add(`0)">
|
<member name="M:FreeSql.DbSet`1.Add(`0)">
|
||||||
<summary>
|
<summary>
|
||||||
添加
|
添加
|
||||||
|
@ -2,6 +2,8 @@ using FreeSql.DataAnnotations;
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
|
|
||||||
namespace FreeSql.Tests.Sqlite
|
namespace FreeSql.Tests.Sqlite
|
||||||
@ -1375,6 +1377,169 @@ namespace FreeSql.Tests.Sqlite
|
|||||||
.ToList(true);
|
.ToList(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
async public Task Include_ManyToManyAsync()
|
||||||
|
{
|
||||||
|
ThreadPool.SetMinThreads(100, 100);
|
||||||
|
await Task.Yield();
|
||||||
|
|
||||||
|
var tag1 = new Tag
|
||||||
|
{
|
||||||
|
Ddd = DateTime.Now.Second,
|
||||||
|
Name = "test_manytoMany_01_中国"
|
||||||
|
};
|
||||||
|
tag1.Id = (int)await g.sqlite.Insert(tag1).ExecuteIdentityAsync();
|
||||||
|
var tag2 = new Tag
|
||||||
|
{
|
||||||
|
Ddd = DateTime.Now.Second,
|
||||||
|
Name = "test_manytoMany_02_美国"
|
||||||
|
};
|
||||||
|
tag2.Id = (int)await g.sqlite.Insert(tag2).ExecuteIdentityAsync();
|
||||||
|
var tag3 = new Tag
|
||||||
|
{
|
||||||
|
Ddd = DateTime.Now.Second,
|
||||||
|
Name = "test_manytoMany_03_日本"
|
||||||
|
};
|
||||||
|
tag3.Id = (int)await g.sqlite.Insert(tag3).ExecuteIdentityAsync();
|
||||||
|
|
||||||
|
var song1 = new Song
|
||||||
|
{
|
||||||
|
Create_time = DateTime.Now,
|
||||||
|
Title = "test_manytoMany_01_我是中国人.mp3",
|
||||||
|
Url = "http://ww.baidu.com/"
|
||||||
|
};
|
||||||
|
song1.Id = (int)await g.sqlite.Insert(song1).ExecuteIdentityAsync();
|
||||||
|
var song2 = new Song
|
||||||
|
{
|
||||||
|
Create_time = DateTime.Now,
|
||||||
|
Title = "test_manytoMany_02_爱你一万年.mp3",
|
||||||
|
Url = "http://ww.163.com/"
|
||||||
|
};
|
||||||
|
song2.Id = (int)await g.sqlite.Insert(song2).ExecuteIdentityAsync();
|
||||||
|
var song3 = new Song
|
||||||
|
{
|
||||||
|
Create_time = DateTime.Now,
|
||||||
|
Title = "test_manytoMany_03_千年等一回.mp3",
|
||||||
|
Url = "http://ww.sina.com/"
|
||||||
|
};
|
||||||
|
song3.Id = (int)await g.sqlite.Insert(song3).ExecuteIdentityAsync();
|
||||||
|
|
||||||
|
await g.sqlite.Insert(new Song_tag { Song_id = song1.Id, Tag_id = tag1.Id }).ExecuteAffrowsAsync();
|
||||||
|
await g.sqlite.Insert(new Song_tag { Song_id = song2.Id, Tag_id = tag1.Id }).ExecuteAffrowsAsync();
|
||||||
|
await g.sqlite.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag1.Id }).ExecuteAffrowsAsync();
|
||||||
|
await g.sqlite.Insert(new Song_tag { Song_id = song1.Id, Tag_id = tag2.Id }).ExecuteAffrowsAsync();
|
||||||
|
await g.sqlite.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag2.Id }).ExecuteAffrowsAsync();
|
||||||
|
await g.sqlite.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag3.Id }).ExecuteAffrowsAsync();
|
||||||
|
|
||||||
|
await new List<Song>(new[] { song1, song2, song3 }).IncludeManyAsync(g.sqlite, a => a.Tags);
|
||||||
|
|
||||||
|
var songs1 = await g.sqlite.Select<Song>()
|
||||||
|
.IncludeMany(a => a.Tags)
|
||||||
|
.Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
|
||||||
|
.ToListAsync();
|
||||||
|
Assert.Equal(3, songs1.Count);
|
||||||
|
Assert.Equal(2, songs1[0].Tags.Count);
|
||||||
|
Assert.Equal(1, songs1[1].Tags.Count);
|
||||||
|
Assert.Equal(3, songs1[2].Tags.Count);
|
||||||
|
|
||||||
|
var songs2 = await g.sqlite.Select<Song>()
|
||||||
|
.IncludeMany(a => a.Tags,
|
||||||
|
then => then.IncludeMany(t => t.Songs))
|
||||||
|
.Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
|
||||||
|
.ToListAsync();
|
||||||
|
Assert.Equal(3, songs2.Count);
|
||||||
|
Assert.Equal(2, songs2[0].Tags.Count);
|
||||||
|
Assert.Equal(1, songs2[1].Tags.Count);
|
||||||
|
Assert.Equal(3, songs2[2].Tags.Count);
|
||||||
|
|
||||||
|
var tags3 = await g.sqlite.Select<Song_tag>()
|
||||||
|
.Include(a => a.Tag.Parent)
|
||||||
|
.IncludeMany(a => a.Tag.Songs)
|
||||||
|
.Where(a => a.Tag.Id == tag1.Id || a.Tag.Id == tag2.Id)
|
||||||
|
.ToListAsync(true);
|
||||||
|
|
||||||
|
|
||||||
|
var songs11 = await g.sqlite.Select<Song>()
|
||||||
|
.IncludeMany(a => a.Tags.Take(1))
|
||||||
|
.Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
|
||||||
|
.ToListAsync();
|
||||||
|
Assert.Equal(3, songs11.Count);
|
||||||
|
Assert.Equal(1, songs11[0].Tags.Count);
|
||||||
|
Assert.Equal(1, songs11[1].Tags.Count);
|
||||||
|
Assert.Equal(1, songs11[2].Tags.Count);
|
||||||
|
|
||||||
|
var songs22 = await g.sqlite.Select<Song>()
|
||||||
|
.IncludeMany(a => a.Tags.Take(1),
|
||||||
|
then => then.IncludeMany(t => t.Songs.Take(1)))
|
||||||
|
.Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
|
||||||
|
.ToListAsync();
|
||||||
|
Assert.Equal(3, songs22.Count);
|
||||||
|
Assert.Equal(1, songs22[0].Tags.Count);
|
||||||
|
Assert.Equal(1, songs22[1].Tags.Count);
|
||||||
|
Assert.Equal(1, songs22[2].Tags.Count);
|
||||||
|
|
||||||
|
var tags33 = await g.sqlite.Select<Song_tag>()
|
||||||
|
.Include(a => a.Tag.Parent)
|
||||||
|
.IncludeMany(a => a.Tag.Songs.Take(1))
|
||||||
|
.Where(a => a.Tag.Id == tag1.Id || a.Tag.Id == tag2.Id)
|
||||||
|
.ToListAsync(true);
|
||||||
|
|
||||||
|
// --- Select ---
|
||||||
|
|
||||||
|
await new List<Song>(new[] { song1, song2, song3 }).IncludeManyAsync(g.sqlite, a => a.Tags.Select(b => new Tag { Id = b.Id, Name = b.Name }));
|
||||||
|
|
||||||
|
var asongs1 = await g.sqlite.Select<Song>()
|
||||||
|
.IncludeMany(a => a.Tags.Select(b => new Tag { Id = b.Id, Name = b.Name }))
|
||||||
|
.Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
|
||||||
|
.ToListAsync();
|
||||||
|
Assert.Equal(3, songs1.Count);
|
||||||
|
Assert.Equal(2, songs1[0].Tags.Count);
|
||||||
|
Assert.Equal(1, songs1[1].Tags.Count);
|
||||||
|
Assert.Equal(3, songs1[2].Tags.Count);
|
||||||
|
|
||||||
|
var asongs2 = await g.sqlite.Select<Song>()
|
||||||
|
.IncludeMany(a => a.Tags.Select(b => new Tag { Id = b.Id, Name = b.Name }),
|
||||||
|
then => then.IncludeMany(t => t.Songs.Select(b => new Song { Id = b.Id, Title = b.Title })))
|
||||||
|
.Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
|
||||||
|
.ToListAsync();
|
||||||
|
Assert.Equal(3, songs2.Count);
|
||||||
|
Assert.Equal(2, songs2[0].Tags.Count);
|
||||||
|
Assert.Equal(1, songs2[1].Tags.Count);
|
||||||
|
Assert.Equal(3, songs2[2].Tags.Count);
|
||||||
|
|
||||||
|
var atags3 = await g.sqlite.Select<Song_tag>()
|
||||||
|
.Include(a => a.Tag.Parent)
|
||||||
|
.IncludeMany(a => a.Tag.Songs.Select(b => new Song { Id = b.Id, Title = b.Title }))
|
||||||
|
.Where(a => a.Tag.Id == tag1.Id || a.Tag.Id == tag2.Id)
|
||||||
|
.ToListAsync(true);
|
||||||
|
|
||||||
|
|
||||||
|
var asongs11 = await g.sqlite.Select<Song>()
|
||||||
|
.IncludeMany(a => a.Tags.Take(1).Select(b => new Tag { Id = b.Id, Name = b.Name }))
|
||||||
|
.Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
|
||||||
|
.ToListAsync();
|
||||||
|
Assert.Equal(3, songs11.Count);
|
||||||
|
Assert.Equal(1, songs11[0].Tags.Count);
|
||||||
|
Assert.Equal(1, songs11[1].Tags.Count);
|
||||||
|
Assert.Equal(1, songs11[2].Tags.Count);
|
||||||
|
|
||||||
|
var asongs22 = await g.sqlite.Select<Song>()
|
||||||
|
.IncludeMany(a => a.Tags.Take(1).Select(b => new Tag { Id = b.Id, Name = b.Name }),
|
||||||
|
then => then.IncludeMany(t => t.Songs.Take(1).Select(b => new Song { Id = b.Id, Title = b.Title })))
|
||||||
|
.Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
|
||||||
|
.ToListAsync();
|
||||||
|
Assert.Equal(3, songs22.Count);
|
||||||
|
Assert.Equal(1, songs22[0].Tags.Count);
|
||||||
|
Assert.Equal(1, songs22[1].Tags.Count);
|
||||||
|
Assert.Equal(1, songs22[2].Tags.Count);
|
||||||
|
|
||||||
|
var atags33 = await g.sqlite.Select<Song_tag>()
|
||||||
|
.Include(a => a.Tag.Parent)
|
||||||
|
.IncludeMany(a => a.Tag.Songs.Take(1).Select(b => new Song { Id = b.Id, Title = b.Title }))
|
||||||
|
.Where(a => a.Tag.Id == tag1.Id || a.Tag.Id == tag2.Id)
|
||||||
|
.ToListAsync(true);
|
||||||
|
}
|
||||||
|
|
||||||
public class ToDel1Pk
|
public class ToDel1Pk
|
||||||
{
|
{
|
||||||
[Column(IsIdentity = true)]
|
[Column(IsIdentity = true)]
|
||||||
|
@ -3,7 +3,7 @@ using System;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
public class g
|
public class g
|
||||||
{
|
{
|
||||||
@ -13,8 +13,9 @@ public class g
|
|||||||
.UseAutoSyncStructure(true)
|
.UseAutoSyncStructure(true)
|
||||||
//.UseGenerateCommandParameterWithLambda(true)
|
//.UseGenerateCommandParameterWithLambda(true)
|
||||||
.UseMonitorCommand(
|
.UseMonitorCommand(
|
||||||
cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
|
cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前
|
||||||
(cmd, traceLog) => Console.WriteLine(traceLog))
|
//, (cmd, traceLog) => Console.WriteLine(traceLog)
|
||||||
|
)
|
||||||
.UseLazyLoading(true)
|
.UseLazyLoading(true)
|
||||||
.Build());
|
.Build());
|
||||||
public static IFreeSql mysql => mysqlLazy.Value;
|
public static IFreeSql mysql => mysqlLazy.Value;
|
||||||
@ -29,8 +30,9 @@ public class g
|
|||||||
.UseSyncStructureToLower(true)
|
.UseSyncStructureToLower(true)
|
||||||
.UseLazyLoading(true)
|
.UseLazyLoading(true)
|
||||||
.UseMonitorCommand(
|
.UseMonitorCommand(
|
||||||
cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
|
cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前
|
||||||
(cmd, traceLog) => Console.WriteLine(traceLog))
|
//, (cmd, traceLog) => Console.WriteLine(traceLog)
|
||||||
|
)
|
||||||
.Build();
|
.Build();
|
||||||
});
|
});
|
||||||
public static IFreeSql pgsql => pgsqlLazy.Value;
|
public static IFreeSql pgsql => pgsqlLazy.Value;
|
||||||
@ -41,8 +43,9 @@ public class g
|
|||||||
.UseAutoSyncStructure(true)
|
.UseAutoSyncStructure(true)
|
||||||
//.UseGenerateCommandParameterWithLambda(true)
|
//.UseGenerateCommandParameterWithLambda(true)
|
||||||
.UseMonitorCommand(
|
.UseMonitorCommand(
|
||||||
cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
|
cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前
|
||||||
(cmd, traceLog) => Console.WriteLine(traceLog))
|
//, (cmd, traceLog) => Console.WriteLine(traceLog)
|
||||||
|
)
|
||||||
.UseLazyLoading(true)
|
.UseLazyLoading(true)
|
||||||
.Build());
|
.Build());
|
||||||
public static IFreeSql sqlserver => sqlserverLazy.Value;
|
public static IFreeSql sqlserver => sqlserverLazy.Value;
|
||||||
@ -56,8 +59,9 @@ public class g
|
|||||||
//.UseNoneCommandParameter(true)
|
//.UseNoneCommandParameter(true)
|
||||||
|
|
||||||
.UseMonitorCommand(
|
.UseMonitorCommand(
|
||||||
cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
|
cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前
|
||||||
(cmd, traceLog) => Console.WriteLine(traceLog))
|
//, (cmd, traceLog) => Console.WriteLine(traceLog)
|
||||||
|
)
|
||||||
.Build());
|
.Build());
|
||||||
public static IFreeSql oracle => oracleLazy.Value;
|
public static IFreeSql oracle => oracleLazy.Value;
|
||||||
|
|
||||||
@ -67,8 +71,9 @@ public class g
|
|||||||
//.UseGenerateCommandParameterWithLambda(true)
|
//.UseGenerateCommandParameterWithLambda(true)
|
||||||
.UseLazyLoading(true)
|
.UseLazyLoading(true)
|
||||||
.UseMonitorCommand(
|
.UseMonitorCommand(
|
||||||
cmd => Trace.WriteLine(cmd.CommandText), //监听SQL命令对象,在执行前
|
cmd => Trace.WriteLine("\r\n线程" + Thread.CurrentThread.ManagedThreadId + ": " + cmd.CommandText) //监听SQL命令对象,在执行前
|
||||||
(cmd, traceLog) => Console.WriteLine(traceLog))
|
//, (cmd, traceLog) => Console.WriteLine(traceLog)
|
||||||
|
)
|
||||||
.Build());
|
.Build());
|
||||||
public static IFreeSql sqlite => sqliteLazy.Value;
|
public static IFreeSql sqlite => sqliteLazy.Value;
|
||||||
}
|
}
|
||||||
|
@ -210,5 +210,16 @@ public static partial class FreeSqlGlobalExtensions
|
|||||||
select.SetList(list);
|
select.SetList(list);
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if net40
|
||||||
|
#else
|
||||||
|
async public static System.Threading.Tasks.Task<List<T1>> IncludeManyAsync<T1, TNavigate>(this List<T1> list, IFreeSql orm, Expression<Func<T1, IEnumerable<TNavigate>>> navigateSelector, Action<ISelect<TNavigate>> then = null) where T1 : class where TNavigate : class
|
||||||
|
{
|
||||||
|
if (list == null || list.Any() == false) return list;
|
||||||
|
var select = orm.Select<T1>().IncludeMany(navigateSelector, then) as FreeSql.Internal.CommonProvider.Select1Provider<T1>;
|
||||||
|
await select.SetListAsync(list);
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
@ -2049,6 +2049,137 @@
|
|||||||
<param name="parms"></param>
|
<param name="parms"></param>
|
||||||
<returns></returns>
|
<returns></returns>
|
||||||
</member>
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{System.Data.Common.DbDataReader,System.Threading.Tasks.Task},System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
查询,若使用读写分离,查询【从库】条件cmdText.StartsWith("SELECT "),否则查询【主库】
|
||||||
|
</summary>
|
||||||
|
<param name="readerHander"></param>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteReaderAsync(System.Func{System.Data.Common.DbDataReader,System.Threading.Tasks.Task},System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteReaderAsync(dr => {}, "select * from user where age > @age", new { age = 25 })
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
查询
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteArrayAsync(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteArrayAsync("select * from user where age > @age", new { age = 25 })
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
查询
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataSetAsync(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteDataSetAsync("select * from user where age > @age; select 2", new { age = 25 })
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
查询
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteDataTableAsync(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
查询,ExecuteDataTableAsync("select * from user where age > @age", new { age = 25 })
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行
|
||||||
|
</summary>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteNonQueryAsync(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行,ExecuteNonQueryAsync("delete from user where age > @age", new { age = 25 })
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行
|
||||||
|
</summary>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.ExecuteScalarAsync(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
在【主库】执行,ExecuteScalarAsync("select 1 from user where age > @age", new { age = 25 })
|
||||||
|
</summary>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``1(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new SqlParameter { ParameterName = "age", Value = 25 })
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T"></typeparam>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``1(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,QueryAsync<User>("select * from user where age > @age", new { age = 25 })
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T"></typeparam>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``2(System.Data.CommandType,System.String,System.Data.Common.DbParameter[])">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new SqlParameter { ParameterName = "age", Value = 25 })
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="cmdType"></param>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="cmdParms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
|
<member name="M:FreeSql.IAdo.QueryAsync``2(System.String,System.Object)">
|
||||||
|
<summary>
|
||||||
|
执行SQL返回对象集合,Query<User>("select * from user where age > @age; select * from address", new { age = 25 })
|
||||||
|
</summary>
|
||||||
|
<typeparam name="T1"></typeparam>
|
||||||
|
<param name="cmdText"></param>
|
||||||
|
<param name="parms"></param>
|
||||||
|
<returns></returns>
|
||||||
|
</member>
|
||||||
<member name="P:FreeSql.IAop.ParseExpression">
|
<member name="P:FreeSql.IAop.ParseExpression">
|
||||||
<summary>
|
<summary>
|
||||||
可自定义解析表达式
|
可自定义解析表达式
|
||||||
@ -2764,159 +2895,3 @@
|
|||||||
</member>
|
</member>
|
||||||
</members>
|
</members>
|
||||||
</doc>
|
</doc>
|
||||||
</member>
|
|
||||||
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Or``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
|
|
||||||
<summary>
|
|
||||||
使用 or 拼接两个 lambda 表达式
|
|
||||||
</summary>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Or``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Boolean,System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}})">
|
|
||||||
<summary>
|
|
||||||
使用 or 拼接两个 lambda 表达式
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T"></typeparam>
|
|
||||||
<param name="exp1"></param>
|
|
||||||
<param name="condition">true 时生效</param>
|
|
||||||
<param name="exp2"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:System.Linq.Expressions.LambadaExpressionExtensions.Not``1(System.Linq.Expressions.Expression{System.Func{``0,System.Boolean}},System.Boolean)">
|
|
||||||
<summary>
|
|
||||||
将 lambda 表达式取反
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T"></typeparam>
|
|
||||||
<param name="exp"></param>
|
|
||||||
<param name="condition">true 时生效</param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:FreeUtil.NewMongodbId">
|
|
||||||
<summary>
|
|
||||||
生成类似Mongodb的ObjectId有序、不重复Guid
|
|
||||||
</summary>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Insert``1">
|
|
||||||
<summary>
|
|
||||||
插入数据
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Insert``1(``0)">
|
|
||||||
<summary>
|
|
||||||
插入数据,传入实体
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<param name="source"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Insert``1(``0[])">
|
|
||||||
<summary>
|
|
||||||
插入数据,传入实体数组
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<param name="source"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Insert``1(System.Collections.Generic.List{``0})">
|
|
||||||
<summary>
|
|
||||||
插入数据,传入实体集合
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<param name="source"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Insert``1(System.Collections.Generic.IEnumerable{``0})">
|
|
||||||
<summary>
|
|
||||||
插入数据,传入实体集合
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<param name="source"></param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Update``1">
|
|
||||||
<summary>
|
|
||||||
修改数据
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Update``1(System.Object)">
|
|
||||||
<summary>
|
|
||||||
修改数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Select``1">
|
|
||||||
<summary>
|
|
||||||
查询数据
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Select``1(System.Object)">
|
|
||||||
<summary>
|
|
||||||
查询数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Delete``1">
|
|
||||||
<summary>
|
|
||||||
删除数据
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Delete``1(System.Object)">
|
|
||||||
<summary>
|
|
||||||
删除数据,传入动态对象如:主键值 | new[]{主键值1,主键值2} | TEntity1 | new[]{TEntity1,TEntity2} | new{id=1}
|
|
||||||
</summary>
|
|
||||||
<typeparam name="T1"></typeparam>
|
|
||||||
<param name="dywhere">主键值、主键值集合、实体、实体集合、匿名对象、匿名对象集合</param>
|
|
||||||
<returns></returns>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Transaction(System.Action)">
|
|
||||||
<summary>
|
|
||||||
开启事务(不支持异步),60秒未执行完将自动提交
|
|
||||||
</summary>
|
|
||||||
<param name="handler">事务体 () => {}</param>
|
|
||||||
</member>
|
|
||||||
<member name="M:IFreeSql.Transaction(System.Action,System.TimeSpan)">
|
|
||||||
<summary>
|
|
||||||
开启事务(不支持异步)
|
|
||||||
</summary>
|
|
||||||
<param name="handler">事务体 () => {}</param>
|
|
||||||
<param name="timeout">超时,未执行完将自动提交</param>
|
|
||||||
</member>
|
|
||||||
<member name="P:IFreeSql.Ado">
|
|
||||||
<summary>
|
|
||||||
数据库访问对象
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:IFreeSql.Aop">
|
|
||||||
<summary>
|
|
||||||
所有拦截方法都在这里
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:IFreeSql.CodeFirst">
|
|
||||||
<summary>
|
|
||||||
CodeFirst 模式开发相关方法
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:IFreeSql.DbFirst">
|
|
||||||
<summary>
|
|
||||||
DbFirst 模式开发相关方法
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
<member name="P:IFreeSql.GlobalFilter">
|
|
||||||
<summary>
|
|
||||||
全局过滤设置,可默认附加为 Select/Update/Delete 条件
|
|
||||||
</summary>
|
|
||||||
</member>
|
|
||||||
</members>
|
|
||||||
</doc>
|
|
||||||
|
@ -34,6 +34,10 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
protected DbConnection _connection;
|
protected DbConnection _connection;
|
||||||
protected Action<object> _trackToList;
|
protected Action<object> _trackToList;
|
||||||
protected List<Action<object>> _includeToList = new List<Action<object>>();
|
protected List<Action<object>> _includeToList = new List<Action<object>>();
|
||||||
|
#if net40
|
||||||
|
#else
|
||||||
|
protected List<Func<object, Task>> _includeToListAsync = new List<Func<object, Task>>();
|
||||||
|
#endif
|
||||||
protected bool _distinct;
|
protected bool _distinct;
|
||||||
protected Expression _selectExpression;
|
protected Expression _selectExpression;
|
||||||
protected List<LambdaExpression> _whereCascadeExpression = new List<LambdaExpression>();
|
protected List<LambdaExpression> _whereCascadeExpression = new List<LambdaExpression>();
|
||||||
@ -50,6 +54,10 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
_join.Clear();
|
_join.Clear();
|
||||||
_trackToList = null;
|
_trackToList = null;
|
||||||
_includeToList.Clear();
|
_includeToList.Clear();
|
||||||
|
#if net40
|
||||||
|
#else
|
||||||
|
_includeToListAsync.Clear();
|
||||||
|
#endif
|
||||||
_selectExpression = null;
|
_selectExpression = null;
|
||||||
_whereCascadeExpression.Clear();
|
_whereCascadeExpression.Clear();
|
||||||
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
|
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
|
||||||
@ -104,6 +112,10 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
toType.GetField("_connection", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._connection);
|
toType.GetField("_connection", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._connection);
|
||||||
toType.GetField("_trackToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._trackToList);
|
toType.GetField("_trackToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._trackToList);
|
||||||
toType.GetField("_includeToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._includeToList);
|
toType.GetField("_includeToList", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._includeToList);
|
||||||
|
#if net40
|
||||||
|
#else
|
||||||
|
toType.GetField("_includeToListAsync", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._includeToListAsync);
|
||||||
|
#endif
|
||||||
toType.GetField("_distinct", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._distinct);
|
toType.GetField("_distinct", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._distinct);
|
||||||
toType.GetField("_selectExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._selectExpression);
|
toType.GetField("_selectExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._selectExpression);
|
||||||
toType.GetField("_whereCascadeExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereCascadeExpression);
|
toType.GetField("_whereCascadeExpression", BindingFlags.Instance | BindingFlags.NonPublic)?.SetValue(to, from._whereCascadeExpression);
|
||||||
@ -1154,7 +1166,7 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
var after = new Aop.CurdAfterEventArgs(before, exception, ret);
|
var after = new Aop.CurdAfterEventArgs(before, exception, ret);
|
||||||
_orm.Aop.CurdAfter?.Invoke(this, after);
|
_orm.Aop.CurdAfter?.Invoke(this, after);
|
||||||
}
|
}
|
||||||
foreach (var include in _includeToList) include?.Invoke(ret);
|
foreach (var include in _includeToListAsync) await include?.Invoke(ret);
|
||||||
_trackToList?.Invoke(ret);
|
_trackToList?.Invoke(ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -1220,7 +1232,7 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
_orm.Aop.CurdAfter?.Invoke(this, after);
|
_orm.Aop.CurdAfter?.Invoke(this, after);
|
||||||
}
|
}
|
||||||
if (typeof(TReturn) == typeof(T1))
|
if (typeof(TReturn) == typeof(T1))
|
||||||
foreach (var include in _includeToList) include?.Invoke(ret);
|
foreach (var include in _includeToListAsync) await include?.Invoke(ret);
|
||||||
_trackToList?.Invoke(ret);
|
_trackToList?.Invoke(ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -534,8 +534,15 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
if (tbref.Columns.Any() == false) throw throwNavigateSelector;
|
if (tbref.Columns.Any() == false) throw throwNavigateSelector;
|
||||||
}
|
}
|
||||||
|
|
||||||
_includeToList.Add(listObj =>
|
#if net40
|
||||||
|
Action<object, bool> includeToListSyncOrAsync = (listObj, isAsync) =>
|
||||||
{
|
{
|
||||||
|
isAsync = false;
|
||||||
|
#else
|
||||||
|
Func<object, bool, Task> includeToListSyncOrAsync = async (listObj, isAsync) =>
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
var list = listObj as List<T1>;
|
var list = listObj as List<T1>;
|
||||||
if (list == null) return;
|
if (list == null) return;
|
||||||
if (list.Any() == false) return;
|
if (list.Any() == false) return;
|
||||||
@ -576,7 +583,7 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
Expression.Block(
|
Expression.Block(
|
||||||
Expression.Return(returnTarget, Expression.Call(null, GetEntityValueWithPropertyNameMethod, Expression.Constant(_orm), Expression.Constant(membersExp.Type), membersExp, propertyNameExp)),
|
Expression.Return(returnTarget, Expression.Call(null, GetEntityValueWithPropertyNameMethod, Expression.Constant(_orm), Expression.Constant(membersExp.Type), membersExp, propertyNameExp)),
|
||||||
Expression.Label(returnTarget, Expression.Default(typeof(object)))
|
Expression.Label(returnTarget, Expression.Default(typeof(object)))
|
||||||
), t1parm, propertyNameExp).Compile():
|
), t1parm, propertyNameExp).Compile() :
|
||||||
Expression.Lambda<Func<T1, string, object>>(
|
Expression.Lambda<Func<T1, string, object>>(
|
||||||
Expression.Block(
|
Expression.Block(
|
||||||
Expression.IfThen(
|
Expression.IfThen(
|
||||||
@ -700,8 +707,20 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
sbSql.Remove(0, 13);
|
sbSql.Remove(0, 13);
|
||||||
if (sbDic.Count == 1) sbSql.Remove(0, 15).Remove(sbSql.Length - 5, 5);
|
if (sbDic.Count == 1) sbSql.Remove(0, 15).Remove(sbSql.Length - 5, 5);
|
||||||
sbDic.Clear();
|
sbDic.Clear();
|
||||||
|
|
||||||
|
if (isAsync)
|
||||||
|
{
|
||||||
|
#if net40
|
||||||
|
#else
|
||||||
|
if (selectExp == null) subList = await subSelect.ToListAfPrivateAsync(sbSql.ToString(), af, null);
|
||||||
|
else subList = await subSelect.ToListMrPrivateAsync<TNavigate>(sbSql.ToString(), mf, null);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (selectExp == null) subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, null);
|
if (selectExp == null) subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, null);
|
||||||
else subList = subSelect.ToListMrPrivate<TNavigate>(sbSql.ToString(), mf, null);
|
else subList = subSelect.ToListMrPrivate<TNavigate>(sbSql.ToString(), mf, null);
|
||||||
|
}
|
||||||
sbSql.Clear();
|
sbSql.Clear();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -731,9 +750,21 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
sbDic.Clear();
|
sbDic.Clear();
|
||||||
}
|
}
|
||||||
subSelect.Where(oldWhere);
|
subSelect.Where(oldWhere);
|
||||||
|
|
||||||
|
if (isAsync)
|
||||||
|
{
|
||||||
|
#if net40
|
||||||
|
#else
|
||||||
|
if (selectExp == null) subList = await subSelect.ToListAsync(true);
|
||||||
|
else subList = await subSelect.ToListAsync<TNavigate>(selectExp);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (selectExp == null) subList = subSelect.ToList(true);
|
if (selectExp == null) subList = subSelect.ToList(true);
|
||||||
else subList = subSelect.ToList<TNavigate>(selectExp);
|
else subList = subSelect.ToList<TNavigate>(selectExp);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (subList.Any() == false)
|
if (subList.Any() == false)
|
||||||
{
|
{
|
||||||
@ -826,7 +857,8 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
{
|
{
|
||||||
if (z > 0) sbJoin.Append(" AND ");
|
if (z > 0) sbJoin.Append(" AND ");
|
||||||
sbJoin.Append($"midtb.{_commonUtils.QuoteSqlName(tbref.MiddleColumns[tbref.Columns.Count + z].Attribute.Name)} = a.{_commonUtils.QuoteSqlName(tbref.RefColumns[z].Attribute.Name)}");
|
sbJoin.Append($"midtb.{_commonUtils.QuoteSqlName(tbref.MiddleColumns[tbref.Columns.Count + z].Attribute.Name)} = a.{_commonUtils.QuoteSqlName(tbref.RefColumns[z].Attribute.Name)}");
|
||||||
if (_whereCascadeExpression.Any()) {
|
if (_whereCascadeExpression.Any())
|
||||||
|
{
|
||||||
var cascade = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Alias = "midtb", AliasInit = "midtb", Table = tbrefMid, Type = SelectTableInfoType.InnerJoin }, _whereCascadeExpression);
|
var cascade = _commonExpression.GetWhereCascadeSql(new SelectTableInfo { Alias = "midtb", AliasInit = "midtb", Table = tbrefMid, Type = SelectTableInfoType.InnerJoin }, _whereCascadeExpression);
|
||||||
if (string.IsNullOrEmpty(cascade) == false)
|
if (string.IsNullOrEmpty(cascade) == false)
|
||||||
sbJoin.Append(" AND (").Append(cascade).Append(")");
|
sbJoin.Append(" AND (").Append(cascade).Append(")");
|
||||||
@ -843,7 +875,7 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
var sbSql = new StringBuilder();
|
var sbSql = new StringBuilder();
|
||||||
|
|
||||||
if (_selectExpression == null)
|
if (_selectExpression == null)
|
||||||
{// return this.InternalToList<T1>(_selectExpression).Select(a => (a, ()).ToList();
|
{
|
||||||
var field = new StringBuilder();
|
var field = new StringBuilder();
|
||||||
var read = new ReadAnonymousTypeInfo();
|
var read = new ReadAnonymousTypeInfo();
|
||||||
read.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties;
|
read.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties;
|
||||||
@ -919,8 +951,19 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
sbSql.Append(subSelect.ToSql($"{(selectExp == null ? af.Field : mf.field)}{otherData?.field}"));
|
sbSql.Append(subSelect.ToSql($"{(selectExp == null ? af.Field : mf.field)}{otherData?.field}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isAsync)
|
||||||
|
{
|
||||||
|
#if net40
|
||||||
|
#else
|
||||||
|
if (selectExp == null) subList = await subSelect.ToListAfPrivateAsync(sbSql.ToString(), af, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
|
||||||
|
else subList = await subSelect.ToListMrPrivateAsync<TNavigate>(sbSql.ToString(), mf, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
if (selectExp == null) subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
|
if (selectExp == null) subList = subSelect.ToListAfPrivate(sbSql.ToString(), af, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
|
||||||
else subList = subSelect.ToListMrPrivate<TNavigate>(sbSql.ToString(), mf, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
|
else subList = subSelect.ToListMrPrivate<TNavigate>(sbSql.ToString(), mf, otherData == null ? null : new[] { (otherData.Value.field, otherData.Value.read, midList) });
|
||||||
|
}
|
||||||
if (subList.Any() == false)
|
if (subList.Any() == false)
|
||||||
{
|
{
|
||||||
foreach (var item in list)
|
foreach (var item in list)
|
||||||
@ -983,7 +1026,13 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
|
|
||||||
|
_includeToList.Add(listObj => includeToListSyncOrAsync(listObj, false));
|
||||||
|
#if net40
|
||||||
|
#else
|
||||||
|
_includeToListAsync.Add(listObj => includeToListSyncOrAsync(listObj, true));
|
||||||
|
#endif
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -995,6 +1044,12 @@ namespace FreeSql.Internal.CommonProvider
|
|||||||
|
|
||||||
#if net40
|
#if net40
|
||||||
#else
|
#else
|
||||||
|
async internal Task SetListAsync(IEnumerable<T1> list)
|
||||||
|
{
|
||||||
|
foreach (var include in _includeToListAsync) await include?.Invoke(list);
|
||||||
|
_trackToList?.Invoke(list);
|
||||||
|
}
|
||||||
|
|
||||||
public Task<TMember> AvgAsync<TMember>(Expression<Func<T1, TMember>> column)
|
public Task<TMember> AvgAsync<TMember>(Expression<Func<T1, TMember>> column)
|
||||||
{
|
{
|
||||||
if (column == null) return Task.FromResult(default(TMember));
|
if (column == null) return Task.FromResult(default(TMember));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user