- 处理 PgArrayToMany AsSelect 子查询 #1145

This commit is contained in:
2881099 2022-06-06 13:36:18 +08:00
parent 50a8d979a5
commit a50c14e77a
2 changed files with 153 additions and 133 deletions

View File

@ -862,6 +862,12 @@ namespace FreeSql
}
}
var atms = navs.Where(a => a.Item1.RefType == TableRefType.PgArrayToMany).ToList();
if (atms.Any())
{
}
if (dbset == rootDbSet)
{
if (CanRemove(data, true) == false) return;

View File

@ -1195,20 +1195,33 @@ namespace FreeSql.Internal
if (fsql != null)
{
if (asSelectParentExp != null)
{ //执行 AsSelect() 的关联OneToManyManyToMany
{
//执行 AsSelect() 的关联OneToManyManyToManyPgArrayToMany
if (fsqltables[0].Parameter == null)
{
fsqltables[0].Alias = $"tb_{fsqltables.Count}";
fsqltables[0].Parameter = Expression.Parameter(asSelectEntityType, fsqltables[0].Alias);
}
var fsqlWhere = _dicExpressionLambdaToSqlAsSelectWhereMethodInfo.GetOrAdd(asSelectEntityType, asSelectEntityType3 =>
typeof(ISelect<>).MakeGenericType(asSelectEntityType3).GetMethod("Where", new[] {
typeof(Expression<>).MakeGenericType(typeof(Func<,>).MakeGenericType(asSelectEntityType3, typeof(bool)))
}));
var parm123Tb = _common.GetTableByEntity(asSelectParentExp.Type);
var parm123Ref = parm123Tb.GetTableRef(asSelectParentExp1.Member.Name, true);
if (parm123Ref != null)
{
if (parm123Ref.RefType == TableRefType.PgArrayToMany)
{
var amtReftbname = ExpressionLambdaToSql(Expression.MakeMemberAccess(asSelectParentExp, parm123Tb.Properties[parm123Tb.ColumnsByPosition[0].CsName]), tsc);
amtReftbname = amtReftbname.Substring(0, amtReftbname.Length - _common.QuoteSqlName(parm123Tb.ColumnsByPosition[0].Attribute.Name).Length - 1);
if (parm123Ref.RefColumns[0] == fsqltables[0].Table.Primarys[0])
(fsql as Select0Provider)._where.Append(" AND (").Append($"{amtReftbname}.{_common.QuoteSqlName(parm123Ref.Columns[0].Attribute.Name)} @> {fsqltables[0].Alias}.{_common.QuoteSqlName(parm123Ref.RefColumns[0].Attribute.Name)}").Append(")");
else if (parm123Ref.Columns[0] == fsqltables[0].Table.Primarys[0])
(fsql as Select0Provider)._where.Append(" AND (").Append($"{amtReftbname}.{_common.QuoteSqlName(parm123Ref.RefColumns[0].Attribute.Name)} @> {fsqltables[0].Alias}.{_common.QuoteSqlName(parm123Ref.Columns[0].Attribute.Name)}").Append(")");
}
else
{
var fsqlWhere = _dicExpressionLambdaToSqlAsSelectWhereMethodInfo.GetOrAdd(asSelectEntityType, asSelectEntityType3 =>
typeof(ISelect<>).MakeGenericType(asSelectEntityType3).GetMethod("Where", new[] {
typeof(Expression<>).MakeGenericType(typeof(Func<,>).MakeGenericType(asSelectEntityType3, typeof(bool)))
}));
var fsqlWhereParam = fsqltables.First().Parameter; //Expression.Parameter(asSelectEntityType);
Expression fsqlWhereExp = null;
if (parm123Ref.RefType == TableRefType.ManyToMany)
@ -1353,6 +1366,7 @@ namespace FreeSql.Internal
fsqlWhere.Invoke(fsql, new object[] { Expression.Lambda(fsqlWhereExp, fsqlWhereParam) });
}
}
}
asSelectBefores.Clear();
switch (exp3.Method.Name)