From c8bdd5e7411a2490429e81e64a29cbd50b9c32e9 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 19 Oct 2023 15:36:48 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20IncludeMany=20?= =?UTF-8?q?=E5=8F=98=E5=BC=82=20Where=20+=20ToList=20dto=20=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E7=BA=A7=E8=81=94=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql/FreeSql.xml | 98 ------------------- .../SelectProvider/Select0Provider.cs | 2 +- .../SelectProvider/Select1Provider.cs | 39 +++++--- Providers/FreeSql.Provider.Xugu/XuguUtils.cs | 2 +- 4 files changed, 28 insertions(+), 113 deletions(-) diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index 0700ca6b..fcc01603 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1084,82 +1084,6 @@ - - - 动态创建实体类型 - - - - - 配置Class - - 类名 - 类标记的特性[Table(Name = "xxx")] [Index(xxxx)] - - - - - 配置属性 - - 属性名称 - 属性类型 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性标记的特性-支持多个 - - - - - 配置属性 - - 属性名称 - 属性类型 - 该属性是否重写父类属性 - 属性默认值 - 属性标记的特性-支持多个 - - - - - 配置父类 - - 父类类型 - - - - - Override属性 - - - - - - Emit动态创建出Class - Type - - - - - - 首字母小写 - - - - - - - 首字母大写 - - - - 获取实体的主键值,以 "*|_,[,_|*" 分割,当任意一个主键属性无值时,返回 null @@ -5842,28 +5766,6 @@ 请使用 fsql.InsertDict(dict) 方法插入字典数据 - - - 动态构建Class Type - - - - - - 根据字典,创建 table 对应的实体对象 - - - - - - - - 根据实体对象,创建 table 对应的字典 - - - - - C#: that >= between && that <= and diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 72e6bea2..bd6e2e13 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -40,7 +40,7 @@ namespace FreeSql.Internal.CommonProvider #else public List> _includeToListAsync = new List>(); #endif - public Dictionary _includeInfo = new Dictionary(); + public Dictionary> _includeInfo = new Dictionary>(); public bool _distinct; public Expression _selectExpression; public List _whereGlobalFilter; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs index d33d7c1c..3a513597 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select1Provider.cs @@ -287,6 +287,7 @@ namespace FreeSql.Internal.CommonProvider public Dictionary Childs { get; } = new Dictionary(); public Expression CurrentExpression { get; } public bool IsOutputPrimary { get; set; } + public List OutputColumns { get; } = new List(); public IncludeManyNewInit(TableInfo table, Expression currentExpression) { this.Table = table; @@ -313,20 +314,26 @@ namespace FreeSql.Internal.CommonProvider { var curIncNewInit = incNewInit; Expression curParmExp = parmExp; - for (var a = 0; a < inc.Value.Length - 1; a++) + for (var a = 0; a < inc.Value.Item1.Length - 1; a++) { - curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value[a].Member); - if (curIncNewInit.Childs.ContainsKey(inc.Value[a].Member.Name) == false) - curIncNewInit.Childs.Add(inc.Value[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value[a].Type), curParmExp)); + curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value.Item1[a].Member); + if (curIncNewInit.Childs.ContainsKey(inc.Value.Item1[a].Member.Name) == false) + curIncNewInit.Childs.Add(inc.Value.Item1[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value.Item1[a].Type), curParmExp)); else - curIncNewInit = curIncNewInit.Childs[inc.Value[a].Member.Name]; + curIncNewInit = curIncNewInit.Childs[inc.Value.Item1[a].Member.Name]; } curIncNewInit.IsOutputPrimary = true; + var outcols = inc.Value.Item2.Columns.Where(a => a.Attribute.IsPrimary == false).ToArray(); + if (outcols.Any()) curIncNewInit.OutputColumns.AddRange(outcols); } MemberInitExpression GetIncludeManyNewInitExpression(IncludeManyNewInit imni) { var bindings = new List(); - if (imni.IsOutputPrimary) bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + if (imni.IsOutputPrimary) + { + bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + if (imni.OutputColumns.Any()) bindings.AddRange(imni.OutputColumns.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + } if (imni.Childs.Any()) bindings.AddRange(imni.Childs.Select(a => Expression.Bind(imni.Table.Properties[a.Key], GetIncludeManyNewInitExpression(a.Value)))); var pgarrayToManys = imni.Table.GetAllTableRef().Select(tr => { @@ -1514,7 +1521,7 @@ namespace FreeSql.Internal.CommonProvider for (var a = 0; a < members.Count; a++) includeValue[a] = members[a]; includeValue[includeValue.Length - 1] = expBody as MemberExpression; var includeKey = $"{string.Join(".", includeValue.Select(a => a.Member.Name))}"; - if (_includeInfo.ContainsKey(includeKey) == false) _includeInfo.Add(includeKey, includeValue); + if (_includeInfo.ContainsKey(includeKey) == false) _includeInfo.Add(includeKey, NativeTuple.Create(includeValue, tbref)); return this; } @@ -1577,20 +1584,26 @@ namespace FreeSql.Internal.CommonProvider { var curIncNewInit = incNewInit; Expression curParmExp = parmExp; - for (var a = 0; a < inc.Value.Length - 1; a++) + for (var a = 0; a < inc.Value.Item1.Length - 1; a++) { - curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value[a].Member); - if (curIncNewInit.Childs.ContainsKey(inc.Value[a].Member.Name) == false) - curIncNewInit.Childs.Add(inc.Value[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value[a].Type), curParmExp)); + curParmExp = Expression.MakeMemberAccess(parmExp, inc.Value.Item1[a].Member); + if (curIncNewInit.Childs.ContainsKey(inc.Value.Item1[a].Member.Name) == false) + curIncNewInit.Childs.Add(inc.Value.Item1[a].Member.Name, curIncNewInit = new IncludeManyNewInit(_orm.CodeFirst.GetTableByEntity(inc.Value.Item1[a].Type), curParmExp)); else - curIncNewInit = curIncNewInit.Childs[inc.Value[a].Member.Name]; + curIncNewInit = curIncNewInit.Childs[inc.Value.Item1[a].Member.Name]; } curIncNewInit.IsOutputPrimary = true; + var outcols = inc.Value.Item2.Columns.Where(a => a.Attribute.IsPrimary == false).ToArray(); + if (outcols.Any()) curIncNewInit.OutputColumns.AddRange(outcols); } MemberInitExpression GetIncludeManyNewInitExpression(IncludeManyNewInit imni) { var bindings = new List(); - if (imni.IsOutputPrimary) bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + if (imni.IsOutputPrimary) + { + bindings.AddRange(imni.Table.Primarys.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + if (imni.OutputColumns.Any()) bindings.AddRange(imni.OutputColumns.Select(a => Expression.Bind(imni.Table.Properties[a.CsName], Expression.MakeMemberAccess(imni.CurrentExpression, imni.Table.Properties[a.CsName])))); + } if (imni.Childs.Any()) bindings.AddRange(imni.Childs.Select(a => Expression.Bind(imni.Table.Properties[a.Key], GetIncludeManyNewInitExpression(a.Value)))); var pgarrayToManys = imni.Table.GetAllTableRef().Select(tr => { diff --git a/Providers/FreeSql.Provider.Xugu/XuguUtils.cs b/Providers/FreeSql.Provider.Xugu/XuguUtils.cs index 573536b8..e6f8702f 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguUtils.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguUtils.cs @@ -129,7 +129,7 @@ namespace FreeSql.Xugu return $"{nametrim.Trim('"').Replace("\".\"", ".").Replace(".\"", ".")}"; } public override string[] SplitTableName(string name) => GetSplitTableNames(name, '"', '"', 2); - public override string QuoteParamterName(string name) => $"@{name}"; + public override string QuoteParamterName(string name) => $":{name}"; public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}";