- 修复 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 ReadAnonymousFieldAsCsNameGroupBy = -10000;
internal string GetFieldAsCsName(string csname)
{
csname = _common.QuoteSqlName(csname);
@ -48,19 +49,19 @@ namespace FreeSql.Internal
if (_common.CodeFirst.IsSyncStructureToUpper) csname = csname.ToUpper();
return csname;
}
internal bool EndsWithDbNestedField(string dbField, string dbNestedField)
{
switch (_ado.DataType)
{
case DataType.SqlServer:
case DataType.OdbcSqlServer:
return dbField.EndsWith(dbNestedField, StringComparison.CurrentCultureIgnoreCase);
}
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)
{
bool LocalEndsWithField(string dbField, string dbNestedField)
{
switch (_ado.DataType)
{
case DataType.SqlServer:
case DataType.OdbcSqlServer:
return dbField.EndsWith(dbNestedField, StringComparison.CurrentCultureIgnoreCase);
}
return dbField.EndsWith(dbNestedField);
}
void LocalSetFieldAlias(ref int localIndex, bool isdiymemexp)
{
if (localIndex >= 0)
@ -73,7 +74,7 @@ namespace FreeSql.Internal
else if (string.IsNullOrEmpty(parent.CsName) == false)
{
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));
}
}
@ -264,7 +265,7 @@ namespace FreeSql.Internal
else if (string.IsNullOrEmpty(parent.CsName) == false)
{
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));
}
}

View File

@ -815,7 +815,7 @@ namespace FreeSql.Internal.CommonProvider
{
var map = new ReadAnonymousTypeInfo();
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
var sql = field.ToString();

View File

@ -19,6 +19,7 @@ namespace FreeSql.Internal.CommonProvider
public CommonExpression _comonExp;
public List<SelectTableInfo> _tables;
public int _groupByLimit, _groupBySkip;
public bool _addFieldAlias;
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;
}
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;
case "Value":
var curtables = _tables;
@ -240,7 +243,9 @@ namespace FreeSql.Internal.CommonProvider
ret._whereGlobalFilter = new List<GlobalFilter.Item>(_select._whereGlobalFilter.ToArray());
ret._cancel = _select._cancel;
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]);
_addFieldAlias = false;
var sql = $"\r\n{this.ToSql(parser._insideSelectList[0].InsideField)}";
ret.WithSql(sql);
ret._diymemexpWithTempQuery = parser;