- 修复 FromQuery + WithTempQuery bug 和单元测试;

This commit is contained in:
2881099
2022-08-12 20:22:10 +08:00
parent 28f65d2871
commit 25621697d4
5 changed files with 146 additions and 4 deletions

View File

@@ -2207,6 +2207,8 @@ namespace FreeSql.Internal
{
if (node.Expression == _oldexp)
return Expression.Property(_newexp, node.Member.Name);
if (node == _oldexp)
return _newexp;
return base.VisitMember(node);
}
}

View File

@@ -155,8 +155,11 @@ namespace FreeSql.Internal.CommonProvider
public List<SelectTableInfo> _outsideTable = new List<SelectTableInfo>();
public WithTempQueryParser(Select0Provider insideSelect, SelectGroupingProvider insideSelectGroup, Expression selector, SelectTableInfo outsideTable)
{
_insideSelectList.Add(new InsideInfo(insideSelect, insideSelectGroup, selector));
_outsideTable.Add(outsideTable);
if (selector != null)
{
_insideSelectList.Add(new InsideInfo(insideSelect, insideSelectGroup, selector));
_outsideTable.Add(outsideTable);
}
}
public class InsideInfo
{
@@ -223,7 +226,7 @@ namespace FreeSql.Internal.CommonProvider
ParseExpMapResult = read;
return $"{ParseExpMatchedTable.Alias}.{read.DbNestedField}";
}
for (var a = 0; a < members.Length; a++)
for (var a = members[0] == ParseExpMatchedTable.Parameter ? 1 : 0; a < members.Length; a++)
{
read = read.Childs.Where(z => z.CsName == (members[a] as MemberExpression)?.Member.Name).FirstOrDefault();
if (read == null) return null;

View File

@@ -141,6 +141,8 @@ namespace FreeSql.Internal.CommonProvider
}
else
{
if (retsp._diymemexpWithTempQuery == null)
retsp._diymemexpWithTempQuery = new WithTempQueryParser(null, null, null, null).Append(select2, rettbs[1]);
if (select2sp._tableRule != null && select2sp.IsDefaultSqlContent == true)
{
sql2 = select2sp._tableRule(select2sp._tables[0].Table.Type, null);

View File

@@ -66,8 +66,10 @@ namespace FreeSql.Internal.CommonProvider
}
if (tempQueryParser._outsideTable.Contains(curtable))
{
var replaceMember = firstMember.Type == curtable.Parameter.Type ? firstMember : members[0];
var replaceVistor = new CommonExpression.ReplaceVisitor();
for (var a = 0; a < members.Length; a++)
members[a] = new CommonExpression.ReplaceVisitor().Modify(members[a], firstMember, curtable.Parameter);
members[a] = replaceVistor.Modify(members[a], replaceMember, curtable.Parameter);
var ret = _select._diymemexpWithTempQuery.ParseExp(members);
ParseExpMapResult = _select._diymemexpWithTempQuery.ParseExpMapResult;
return ret;