From 56d744559e000f9ca9615eb2cda49b3f9b1dddf3 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Mon, 1 Aug 2022 10:06:42 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=20WithMemory=20=E5=9F=BA?= =?UTF-8?q?=E4=BA=8E=E5=86=85=E5=AD=98=E6=9F=A5=E8=AF=A2=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 19 +++++++++++++++++++ FreeSql/FreeSql.xml | 7 +++++++ FreeSql/Interface/Curd/ISelect/ISelect1.cs | 6 ++++++ .../SelectProvider/Select1Provider.cs | 9 +++++++++ 4 files changed, 41 insertions(+) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 0975a45f..37cf7a4e 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -345,6 +345,25 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + var list = new List(); + list.Add(new User1 { Id = Guid.NewGuid() }); + list.Add(new User1 { Id = Guid.NewGuid() }); + list.Add(new User1 { Id = Guid.NewGuid() }); + + var listSql = fsql.Select() + .WithMemory(list) + .ToSql(); + + var listSql2 = fsql.Select() + .FromQuery(fsql.Select().WithMemory(list)) + .InnerJoin((a, b) => a.Id == b.GroupId) + .ToSql(); + + var listSql2Result = fsql.Select() + .FromQuery(fsql.Select().WithMemory(list)) + .InnerJoin((a, b) => a.Id == b.GroupId) + .ToList(); + var anysql01 = fsql.Select().Where(a => a.Roles.Any(b => b.Users.Any(c => c.UserName == "admin"))).ToSql(); var atimpl = fsql.CodeFirst.GetTableByEntity(typeof(AsTableLog)) diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 6cda4744..33f2441b 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -2627,6 +2627,13 @@ 参数 + + + 实现 select .. from ( select .. UNION ALL select .. ) a 这样的功能(基于内存数据) + + 内存数据 + + 嵌套查询 select * from ( select ... from table ... ) a diff --git a/FreeSql/Interface/Curd/ISelect/ISelect1.cs b/FreeSql/Interface/Curd/ISelect/ISelect1.cs index 5442ad67..4115a959 100644 --- a/FreeSql/Interface/Curd/ISelect/ISelect1.cs +++ b/FreeSql/Interface/Curd/ISelect/ISelect1.cs @@ -369,6 +369,12 @@ namespace FreeSql /// 参数 /// ISelect WithSql(string sql, object parms = null); + /// + /// 实现 select .. from ( select .. UNION ALL select .. ) a 这样的功能(基于内存数据) + /// + /// 内存数据 + /// + ISelect WithMemory(IEnumerable source); /// /// 嵌套查询 select * from ( select ... from table ... ) a diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index f4ff080f..c9cbcc19 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -437,6 +437,15 @@ namespace FreeSql.Internal.CommonProvider if (parms != null) _params.AddRange(_commonUtils.GetDbParamtersByObject(sql, parms)); return this; } + public ISelect WithMemory(IEnumerable source) + { + var sb = new StringBuilder(); + (_orm.InsertOrUpdate().AsType(_tables[0].Table.Type) as InsertOrUpdateProvider) + .WriteSourceSelectUnionAll(source.Select(a => (object)a).ToList(), sb, _params); + + try { return WithSql(sb.ToString()); } + finally { sb.Clear(); } + } public ISelect WithTempQuery(Expression> selector) => InternalWithTempQuery(selector);