- 修复 ISelect.WhereCascade 当内部使用 (a as BaseEntity).TenantId 时报错的 bug;

This commit is contained in:
28810 2019-08-09 16:05:20 +08:00
parent ea79084de3
commit ecda6d8f49
2 changed files with 89 additions and 80 deletions

View File

@ -341,9 +341,10 @@ namespace FreeSql.Tests
[Fact] [Fact]
public void Test1() public void Test1()
{ {
g.oracle.Select<Templates, TaskBuild>() var xxxkdkd = g.oracle.Select<Templates, TaskBuild>()
.InnerJoin((a,b) => true) .InnerJoin((a,b) => true)
.Where((a,b) => (DateTime.Now - a.EditTime).TotalMinutes > 100) .Where((a,b) => (DateTime.Now - a.EditTime).TotalMinutes > 100)
.OrderBy((a,b) => g.oracle.Select<Templates>().Where(c => b.Id == c.Id2).Count())
.ToSql(); .ToSql();

View File

@ -708,6 +708,8 @@ namespace FreeSql.Internal
})); }));
var parm123Tb = _common.GetTableByEntity(asSelectParentExp.Type); var parm123Tb = _common.GetTableByEntity(asSelectParentExp.Type);
var parm123Ref = parm123Tb.GetTableRef(asSelectParentExp1.Member.Name, true); var parm123Ref = parm123Tb.GetTableRef(asSelectParentExp1.Member.Name, true);
if (parm123Ref != null)
{
var fsqlWhereParam = fsqltables.First().Parameter; //Expression.Parameter(asSelectEntityType); var fsqlWhereParam = fsqltables.First().Parameter; //Expression.Parameter(asSelectEntityType);
Expression fsqlWhereExp = null; Expression fsqlWhereExp = null;
if (parm123Ref.RefType == TableRefType.ManyToMany) if (parm123Ref.RefType == TableRefType.ManyToMany)
@ -796,6 +798,7 @@ namespace FreeSql.Internal
} }
fsqlWhere.Invoke(fsql, new object[] { Expression.Lambda(fsqlWhereExp, fsqlWhereParam) }); fsqlWhere.Invoke(fsql, new object[] { Expression.Lambda(fsqlWhereExp, fsqlWhereParam) });
} }
}
asSelectBefores.Clear(); asSelectBefores.Clear();
switch (exp3.Method.Name) switch (exp3.Method.Name)
@ -1174,7 +1177,8 @@ namespace FreeSql.Internal
if (_whereCascadeExpression.Any()) if (_whereCascadeExpression.Any())
{ {
var newParameter = Expression.Parameter(tb.Table.Type, "c"); var newParameter = Expression.Parameter(tb.Table.Type, "c");
Expression newExp = null; var sb = new StringBuilder();
var isEmpty = true;
foreach (var fl in _whereCascadeExpression) foreach (var fl in _whereCascadeExpression)
{ {
@ -1184,9 +1188,13 @@ namespace FreeSql.Internal
var visitor = new NewExpressionVisitor(newParameter, fl.Parameters.FirstOrDefault()); var visitor = new NewExpressionVisitor(newParameter, fl.Parameters.FirstOrDefault());
try try
{ {
var andExp = visitor.Replace(fl.Body); var expExp = visitor.Replace(fl.Body);
if (newExp == null) newExp = andExp; var whereSql = ExpressionLambdaToSql(expExp, new ExpTSC { _tables = null, _selectColumnMap = null, getSelectGroupingMapString = null, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = tb.Table, alias001 = tb.Alias });
else newExp = Expression.AndAlso(newExp, andExp); if (isEmpty == false)
sb.Append(" AND ");
else
isEmpty = false;
sb.Append("(").Append(whereSql).Append(")");
} }
catch catch
{ {
@ -1195,8 +1203,8 @@ namespace FreeSql.Internal
} }
} }
if (newExp != null) if (isEmpty == false)
return ExpressionLambdaToSql(newExp, new ExpTSC { _tables = null, _selectColumnMap = null, getSelectGroupingMapString = null, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = tb.Table, alias001 = tb.Alias }); return sb.ToString();
} }
return null; return null;
} }