- 修复 WithTempQuery + Column(Name 别名问题;

This commit is contained in:
2881099 2022-09-07 19:30:55 +08:00
parent d3ff88b0b4
commit 0095130ccf
3 changed files with 19 additions and 13 deletions

View File

@ -41,6 +41,7 @@ namespace FreeSql.Internal
} }
internal const int ReadAnonymousFieldAsCsName = -53129; internal const int ReadAnonymousFieldAsCsName = -53129;
internal const int ReadAnonymousFieldAsCsNameGroupBy = -10000;
internal string GetFieldAsCsName(string csname) internal string GetFieldAsCsName(string csname)
{ {
csname = _common.QuoteSqlName(csname); csname = _common.QuoteSqlName(csname);
@ -48,10 +49,7 @@ namespace FreeSql.Internal
if (_common.CodeFirst.IsSyncStructureToUpper) csname = csname.ToUpper(); if (_common.CodeFirst.IsSyncStructureToUpper) csname = csname.ToUpper();
return csname; return csname;
} }
public bool ReadAnonymousField(List<SelectTableInfo> _tables, Func<Type, string, string> _tableRule, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Select0Provider select, internal bool EndsWithDbNestedField(string dbField, string dbNestedField)
BaseDiyMemberExpression diymemexp, List<GlobalFilter.Item> whereGlobalFilter, List<string> findIncludeMany, List<Expression> findSubSelectMany, bool isAllDtoMap)
{
bool LocalEndsWithField(string dbField, string dbNestedField)
{ {
switch (_ado.DataType) switch (_ado.DataType)
{ {
@ -61,6 +59,9 @@ namespace FreeSql.Internal
} }
return dbField.EndsWith(dbNestedField); return dbField.EndsWith(dbNestedField);
} }
public bool ReadAnonymousField(List<SelectTableInfo> _tables, Func<Type, string, string> _tableRule, StringBuilder field, ReadAnonymousTypeInfo parent, ref int index, Expression exp, Select0Provider select,
BaseDiyMemberExpression diymemexp, List<GlobalFilter.Item> whereGlobalFilter, List<string> findIncludeMany, List<Expression> findSubSelectMany, bool isAllDtoMap)
{
void LocalSetFieldAlias(ref int localIndex, bool isdiymemexp) void LocalSetFieldAlias(ref int localIndex, bool isdiymemexp)
{ {
if (localIndex >= 0) if (localIndex >= 0)
@ -73,7 +74,7 @@ namespace FreeSql.Internal
else if (string.IsNullOrEmpty(parent.CsName) == false) else if (string.IsNullOrEmpty(parent.CsName) == false)
{ {
parent.DbNestedField = GetFieldAsCsName(parent.CsName); parent.DbNestedField = GetFieldAsCsName(parent.CsName);
if (localIndex == ReadAnonymousFieldAsCsName && LocalEndsWithField(parent.DbField, parent.DbNestedField) == false) //DbField 和 CsName 相同的时候,不处理 if (localIndex == ReadAnonymousFieldAsCsName && EndsWithDbNestedField(parent.DbField, parent.DbNestedField) == false) //DbField 和 CsName 相同的时候,不处理
field.Append(_common.FieldAsAlias(parent.DbNestedField)); field.Append(_common.FieldAsAlias(parent.DbNestedField));
} }
} }
@ -264,7 +265,7 @@ namespace FreeSql.Internal
else if (string.IsNullOrEmpty(parent.CsName) == false) else if (string.IsNullOrEmpty(parent.CsName) == false)
{ {
dbNestedField = GetFieldAsCsName(parent.CsName); dbNestedField = GetFieldAsCsName(parent.CsName);
if (index == ReadAnonymousFieldAsCsName && LocalEndsWithField(diymemexp._field, dbNestedField) == false) //DbField 和 CsName 相同的时候,不处理 if (index == ReadAnonymousFieldAsCsName && EndsWithDbNestedField(diymemexp._field, dbNestedField) == false) //DbField 和 CsName 相同的时候,不处理
field.Append(_common.FieldAsAlias(dbNestedField)); field.Append(_common.FieldAsAlias(dbNestedField));
} }
} }

View File

@ -815,7 +815,7 @@ namespace FreeSql.Internal.CommonProvider
{ {
var map = new ReadAnonymousTypeInfo(); var map = new ReadAnonymousTypeInfo();
var field = new StringBuilder(); var field = new StringBuilder();
var index = -10000; //临时规则,不返回 as1 var index = CommonExpression.ReadAnonymousFieldAsCsNameGroupBy; //临时规则,不返回 as1
_commonExpression.ReadAnonymousField(_tables, _tableRule, field, map, ref index, columns, null, _diymemexpWithTempQuery, _whereGlobalFilter, null, null, false); //不走 DTO 映射,不处理 IncludeMany _commonExpression.ReadAnonymousField(_tables, _tableRule, field, map, ref index, columns, null, _diymemexpWithTempQuery, _whereGlobalFilter, null, null, false); //不走 DTO 映射,不处理 IncludeMany
var sql = field.ToString(); var sql = field.ToString();

View File

@ -19,6 +19,7 @@ namespace FreeSql.Internal.CommonProvider
public CommonExpression _comonExp; public CommonExpression _comonExp;
public List<SelectTableInfo> _tables; public List<SelectTableInfo> _tables;
public int _groupByLimit, _groupBySkip; public int _groupByLimit, _groupBySkip;
public bool _addFieldAlias;
public SelectGroupingProvider(IFreeSql orm, Select0Provider select, ReadAnonymousTypeInfo map, string field, CommonExpression comonExp, List<SelectTableInfo> tables) public SelectGroupingProvider(IFreeSql orm, Select0Provider select, ReadAnonymousTypeInfo map, string field, CommonExpression comonExp, List<SelectTableInfo> tables)
{ {
@ -50,6 +51,8 @@ namespace FreeSql.Internal.CommonProvider
if (read == null) return null; if (read == null) return null;
} }
ParseExpMapResult = read; ParseExpMapResult = read;
if (!_addFieldAlias) return read.DbField;
if (_comonExp.EndsWithDbNestedField(read.DbField, read.DbNestedField) == false) return $"{read.DbField}{_comonExp._common.FieldAsAlias(read.DbNestedField)}";
return read.DbField; return read.DbField;
case "Value": case "Value":
var curtables = _tables; var curtables = _tables;
@ -240,7 +243,9 @@ namespace FreeSql.Internal.CommonProvider
ret._whereGlobalFilter = new List<GlobalFilter.Item>(_select._whereGlobalFilter.ToArray()); ret._whereGlobalFilter = new List<GlobalFilter.Item>(_select._whereGlobalFilter.ToArray());
ret._cancel = _select._cancel; ret._cancel = _select._cancel;
if (ret._tables[0].Table == null) ret._tables[0].Table = TableInfo.GetDefaultTable(typeof(TDto)); if (ret._tables[0].Table == null) ret._tables[0].Table = TableInfo.GetDefaultTable(typeof(TDto));
_addFieldAlias = true;
var parser = new Select0Provider.WithTempQueryParser(_select, this, selector, ret._tables[0]); var parser = new Select0Provider.WithTempQueryParser(_select, this, selector, ret._tables[0]);
_addFieldAlias = false;
var sql = $"\r\n{this.ToSql(parser._insideSelectList[0].InsideField)}"; var sql = $"\r\n{this.ToSql(parser._insideSelectList[0].InsideField)}";
ret.WithSql(sql); ret.WithSql(sql);
ret._diymemexpWithTempQuery = parser; ret._diymemexpWithTempQuery = parser;