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}";