From 53d4332bc5dd1741c2cb479929a0c0b06f3607f5 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Mon, 7 Oct 2019 21:14:18 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20List\=20=E6=89=A9?= =?UTF-8?q?=E5=B1=95=E6=96=B9=E6=B3=95=20IncludeMany=EF=BC=8C=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E4=BB=8E=E5=B7=B2=E7=9F=A5=E7=9A=84=E5=86=85=E5=AD=98?= =?UTF-8?q?=20List=20=E6=95=B0=E6=8D=AE=EF=BC=8C=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=92=8C=20ISelect.IncludeMany=20=E7=9B=B8=E5=90=8C=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E7=9A=84=E8=B4=AA=E5=A9=AA=E5=8A=A0=E8=BD=BD=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Sqlite/Curd/SqliteSelectTest.cs | 2 ++ FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 23 +++++++++++++++++++ FreeSql/Interface/Curd/ISelect/ISelect1.cs | 3 ++- .../SelectProvider/Select1Provider.cs | 7 ++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index 2ebc9a90..c95152cd 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -1155,6 +1155,8 @@ namespace FreeSql.Tests.Sqlite g.sqlite.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag2.Id }).ExecuteAffrows(); g.sqlite.Insert(new Song_tag { Song_id = song3.Id, Tag_id = tag3.Id }).ExecuteAffrows(); + new List(new[] { song1, song2, song3 }).IncludeMany(g.sqlite, a => a.Tags); + var songs1 = g.sqlite.Select() .IncludeMany(a => a.Tags) .Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id) diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 4611cd89..071a0904 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -6,6 +6,7 @@ using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; +using System.Linq.Expressions; using System.Reflection; public static partial class FreeSqlGlobalExtensions @@ -167,4 +168,26 @@ public static partial class FreeSqlGlobalExtensions public static ISelect Select(this IFreeSql freesql) where T1 : class where T2 : class where T3 : class where T4 : class where T5 : class where T6 : class where T7 : class where T8 : class where T9 : class where T10 : class => freesql.Select().From((s, b, c, d, e, f, g, h, i, j) => s); #endregion + + #region IncludeMany + /// + /// 本方法实现从已知的内存 List 数据,进行和 ISelect.IncludeMany 相同功能的贪婪加载 + /// 示例:new List<Song>(new[] { song1, song2, song3 }).IncludeMany(g.sqlite, a => a.Tags); + /// 文档:https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd#%E5%AF%BC%E8%88%AA%E5%B1%9E%E6%80%A7-onetomanymanytomany + /// + /// + /// + /// + /// + /// 选择一个集合的导航属性,也可通过 .Where 设置临时的关系映射,还可以 .Take(5) 每个子集合只取5条 + /// 即能 ThenInclude,还可以二次过滤(这个 EFCore 做不到?) + /// + public static List IncludeMany(this List list, IFreeSql orm, Expression>> navigateSelector, Action> then = null) where T1 : class where TNavigate : class + { + if (list == null || list.Any() == false) return list; + var select = orm.Select().IncludeMany(navigateSelector, then) as FreeSql.Internal.CommonProvider.Select1Provider; + select.SetList(list); + return list; + } + #endregion } \ No newline at end of file diff --git a/FreeSql/Interface/Curd/ISelect/ISelect1.cs b/FreeSql/Interface/Curd/ISelect/ISelect1.cs index 0ec2e749..8fc5e393 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect1.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect1.cs @@ -348,7 +348,8 @@ namespace FreeSql /// ISelect Include(Expression> navigateSelector) where TNavigate : class; /// - /// 贪婪加载集合的导航属性,其实是分两次查询,ToList 后进行了数据重装 + /// 贪婪加载集合的导航属性,其实是分两次查询,ToList 后进行了数据重装 + /// 文档:https://github.com/2881099/FreeSql/wiki/%e8%b4%aa%e5%a9%aa%e5%8a%a0%e8%bd%bd#%E5%AF%BC%E8%88%AA%E5%B1%9E%E6%80%A7-onetomanymanytomany /// /// /// 选择一个集合的导航属性,也可通过 .Where 设置临时的关系映射,还可以 .Take(5) 每个子集合只取5条 diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index 76f84598..2a17fde4 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -956,5 +956,12 @@ namespace FreeSql.Internal.CommonProvider }); return this; } + + internal void SetList(IEnumerable list) + { + foreach (var include in _includeToList) include?.Invoke(list); + _orm.Aop.ToList?.Invoke(this, new Aop.ToListEventArgs(list)); + _trackToList?.Invoke(list); + } } } \ No newline at end of file