- 优化 GlobalFilter 过滤器表达式 bool 解析;

This commit is contained in:
28810 2019-12-16 12:12:55 +08:00
parent 38d5580c54
commit fe7b7e5012
14 changed files with 30 additions and 18 deletions

View File

@ -13,6 +13,8 @@ Namespace FreeSql.Tests.VB
Dim List4 = g.sqlserver.Select(Of Testvb).ToList(Function(a) New With {a, a.Id, a.Title}) Dim List4 = g.sqlserver.Select(Of Testvb).ToList(Function(a) New With {a, a.Id, a.Title})
Dim List5 = g.sqlserver.Select(Of Testvb).Where(Function(a) a.IsDeleted).ToList()
End Sub End Sub
End Class End Class
End Namespace End Namespace
@ -20,4 +22,5 @@ End Namespace
Class Testvb Class Testvb
Property Id As Integer Property Id As Integer
Property Title As String Property Title As String
Property IsDeleted As Boolean
End Class End Class

View File

@ -41,6 +41,7 @@ namespace FreeSql.Tests.MySqlConnectorExpression
var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t3 = select.Where(a => a.testFieldBool == false).ToList();
var t4 = select.Where(a => !a.testFieldBool).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList();
var t5 = select.Where(a => a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList();
var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList();
var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList();
var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList();

View File

@ -39,6 +39,7 @@ namespace FreeSql.Tests.Odbc.DamengExpression
var t3 = select.Where(a => a.Bool == false).ToList(); var t3 = select.Where(a => a.Bool == false).ToList();
var t4 = select.Where(a => !a.Bool).ToList(); var t4 = select.Where(a => !a.Bool).ToList();
var t5 = select.Where(a => a.Bool).ToList(); var t5 = select.Where(a => a.Bool).ToList();
var t51 = select.WhereCascade(a => a.Bool).Limit(10).ToList();
var t11 = select.Where(a => a.BoolNullable == true).ToList(); var t11 = select.Where(a => a.BoolNullable == true).ToList();
var t22 = select.Where(a => a.BoolNullable != true).ToList(); var t22 = select.Where(a => a.BoolNullable != true).ToList();

View File

@ -35,6 +35,7 @@ namespace FreeSql.Tests.Odbc.DefaultExpression
var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t3 = select.Where(a => a.testFieldBool == false).ToList();
var t4 = select.Where(a => !a.testFieldBool).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList();
var t5 = select.Where(a => a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList();
var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList();
var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList();
var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList();

View File

@ -41,6 +41,7 @@ namespace FreeSql.Tests.Odbc.MySqlExpression
var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t3 = select.Where(a => a.testFieldBool == false).ToList();
var t4 = select.Where(a => !a.testFieldBool).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList();
var t5 = select.Where(a => a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList();
var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList();
var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList();
var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList();

View File

@ -39,6 +39,7 @@ namespace FreeSql.Tests.Odbc.OracleExpression
var t3 = select.Where(a => a.Bool == false).ToList(); var t3 = select.Where(a => a.Bool == false).ToList();
var t4 = select.Where(a => !a.Bool).ToList(); var t4 = select.Where(a => !a.Bool).ToList();
var t5 = select.Where(a => a.Bool).ToList(); var t5 = select.Where(a => a.Bool).ToList();
var t51 = select.WhereCascade(a => a.Bool).Limit(10).ToList();
var t11 = select.Where(a => a.BoolNullable == true).ToList(); var t11 = select.Where(a => a.BoolNullable == true).ToList();
var t22 = select.Where(a => a.BoolNullable != true).ToList(); var t22 = select.Where(a => a.BoolNullable != true).ToList();

View File

@ -44,6 +44,7 @@ namespace FreeSql.Tests.Odbc.PostgreSQLExpression
var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t3 = select.Where(a => a.testFieldBool == false).ToList();
var t4 = select.Where(a => !a.testFieldBool).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList();
var t5 = select.Where(a => a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList();
var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList();
var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList();
var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList();

View File

@ -36,6 +36,7 @@ namespace FreeSql.Tests.Odbc.SqlServerExpression
var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t3 = select.Where(a => a.testFieldBool == false).ToList();
var t4 = select.Where(a => !a.testFieldBool).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList();
var t5 = select.Where(a => a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList();
var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList();
var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList();
var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList();

View File

@ -41,6 +41,7 @@ namespace FreeSql.Tests.MySqlExpression
var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t3 = select.Where(a => a.testFieldBool == false).ToList();
var t4 = select.Where(a => !a.testFieldBool).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList();
var t5 = select.Where(a => a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList();
var t51 = select.WhereCascade(a => a.testFieldBool).ToList();
var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList();
var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList();

View File

@ -39,6 +39,7 @@ namespace FreeSql.Tests.OracleExpression
var t3 = select.Where(a => a.Bool == false).ToList(); var t3 = select.Where(a => a.Bool == false).ToList();
var t4 = select.Where(a => !a.Bool).ToList(); var t4 = select.Where(a => !a.Bool).ToList();
var t5 = select.Where(a => a.Bool).ToList(); var t5 = select.Where(a => a.Bool).ToList();
var t51 = select.WhereCascade(a => a.Bool).ToList();
var t11 = select.Where(a => a.BoolNullable == true).ToList(); var t11 = select.Where(a => a.BoolNullable == true).ToList();
var t22 = select.Where(a => a.BoolNullable != true).ToList(); var t22 = select.Where(a => a.BoolNullable != true).ToList();

View File

@ -48,6 +48,7 @@ namespace FreeSql.Tests.PostgreSQLExpression
var t3 = select.Where(a => a.testFieldBool == false).Limit(10).ToList(); var t3 = select.Where(a => a.testFieldBool == false).Limit(10).ToList();
var t4 = select.Where(a => !a.testFieldBool).Limit(10).ToList(); var t4 = select.Where(a => !a.testFieldBool).Limit(10).ToList();
var t5 = select.Where(a => a.testFieldBool).Limit(10).ToList(); var t5 = select.Where(a => a.testFieldBool).Limit(10).ToList();
var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList();
var t11 = select.Where(a => a.testFieldBoolNullable == true).Limit(10).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).Limit(10).ToList();
var t22 = select.Where(a => a.testFieldBoolNullable != true).Limit(10).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).Limit(10).ToList();

View File

@ -44,6 +44,7 @@ namespace FreeSql.Tests.SqlServerExpression
var t3 = select.Where(a => a.testFieldBool == false).ToList(); var t3 = select.Where(a => a.testFieldBool == false).ToList();
var t4 = select.Where(a => !a.testFieldBool).ToList(); var t4 = select.Where(a => !a.testFieldBool).ToList();
var t5 = select.Where(a => a.testFieldBool).ToList(); var t5 = select.Where(a => a.testFieldBool).ToList();
var t51 = select.WhereCascade(a => a.testFieldBool).Limit(10).ToList();
var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList(); var t11 = select.Where(a => a.testFieldBoolNullable == true).ToList();
var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList(); var t22 = select.Where(a => a.testFieldBoolNullable != true).ToList();

View File

@ -39,6 +39,7 @@ namespace FreeSql.Tests.SqliteExpression
var t3 = select.Where(a => a.Bool == false).ToList(); var t3 = select.Where(a => a.Bool == false).ToList();
var t4 = select.Where(a => !a.Bool).ToList(); var t4 = select.Where(a => !a.Bool).ToList();
var t5 = select.Where(a => a.Bool).ToList(); var t5 = select.Where(a => a.Bool).ToList();
var t51 = select.WhereCascade(a => a.Bool).Limit(10).ToList();
var t11 = select.Where(a => a.BoolNullable == true).ToList(); var t11 = select.Where(a => a.BoolNullable == true).ToList();
var t22 = select.Where(a => a.BoolNullable != true).ToList(); var t22 = select.Where(a => a.BoolNullable != true).ToList();

View File

@ -342,37 +342,24 @@ namespace FreeSql.Internal
{ ExpressionType.Modulo, "%" }, { ExpressionType.Modulo, "%" },
{ ExpressionType.Equal, "=" }, { ExpressionType.Equal, "=" },
}; };
public string ExpressionWhereLambdaNoneForeignObject(List<SelectTableInfo> _tables, TableInfo table, List<SelectColumnInfo> _selectColumnMap, Expression exp, Func<Expression[], string> getSelectGroupingMapString, List<DbParameter> dbParams) public string ExpressionWhereLambdaNoneForeignObject(List<SelectTableInfo> _tables, TableInfo table, List<SelectColumnInfo> _selectColumnMap, Expression exp, Func<Expression[], string> getSelectGroupingMapString, List<DbParameter> dbParams)
{ {
var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table, dbParams = dbParams }); var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, _selectColumnMap = _selectColumnMap, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = table, dbParams = dbParams });
var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); return GetBoolString(exp, sql);
if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false)
return $"{sql} = {formatSql(true, null, null, null)}";
if (isBool)
return GetBoolString(sql);
return sql;
} }
public string ExpressionWhereLambda(List<SelectTableInfo> _tables, Expression exp, Func<Expression[], string> getSelectGroupingMapString, List<LambdaExpression> whereCascadeExpression, List<DbParameter> dbParams) public string ExpressionWhereLambda(List<SelectTableInfo> _tables, Expression exp, Func<Expression[], string> getSelectGroupingMapString, List<LambdaExpression> whereCascadeExpression, List<DbParameter> dbParams)
{ {
var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression, dbParams = dbParams }); var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression, dbParams = dbParams });
var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); return GetBoolString(exp, sql);
if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false)
return $"{sql} = {formatSql(true, null, null, null)}";
if (isBool)
return GetBoolString(sql);
return sql;
} }
static ConcurrentDictionary<string, Regex> dicRegexAlias = new ConcurrentDictionary<string, Regex>(); static ConcurrentDictionary<string, Regex> dicRegexAlias = new ConcurrentDictionary<string, Regex>();
public void ExpressionJoinLambda(List<SelectTableInfo> _tables, SelectTableInfoType tbtype, Expression exp, Func<Expression[], string> getSelectGroupingMapString, List<LambdaExpression> whereCascadeExpression) public void ExpressionJoinLambda(List<SelectTableInfo> _tables, SelectTableInfoType tbtype, Expression exp, Func<Expression[], string> getSelectGroupingMapString, List<LambdaExpression> whereCascadeExpression)
{ {
var tbidx = _tables.Count; var tbidx = _tables.Count;
var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression }); var sql = ExpressionLambdaToSql(exp, new ExpTSC { _tables = _tables, getSelectGroupingMapString = getSelectGroupingMapString, tbtype = tbtype, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, whereCascadeExpression = whereCascadeExpression });
var isBool = exp.Type.NullableTypeOrThis() == typeof(bool); sql = GetBoolString(exp, sql);
if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false)
sql = $"{sql} = {formatSql(true, null, null, null)}";
if (isBool)
sql = GetBoolString(sql);
if (_tables.Count > tbidx) if (_tables.Count > tbidx)
{ {
@ -404,6 +391,15 @@ namespace FreeSql.Internal
static MethodInfo MethodDateTimeSubtractTimeSpan = typeof(DateTime).GetMethod("Subtract", new Type[] { typeof(TimeSpan) }); static MethodInfo MethodDateTimeSubtractTimeSpan = typeof(DateTime).GetMethod("Subtract", new Type[] { typeof(TimeSpan) });
static MethodInfo MethodMathFloor = typeof(Math).GetMethod("Floor", new Type[] { typeof(double) }); static MethodInfo MethodMathFloor = typeof(Math).GetMethod("Floor", new Type[] { typeof(double) });
public string GetBoolString(Expression exp, string sql)
{
var isBool = exp.Type.NullableTypeOrThis() == typeof(bool);
if (exp.NodeType == ExpressionType.MemberAccess && isBool && sql.Contains(" IS ") == false && sql.Contains(" = ") == false)
return $"{sql} = {formatSql(true, null, null, null)}";
if (isBool)
return GetBoolString(sql);
return sql;
}
static string GetBoolString(string sql) static string GetBoolString(string sql)
{ {
switch (sql) switch (sql)
@ -1340,7 +1336,8 @@ namespace FreeSql.Internal
new ReplaceVisitor().Modify(fl.Body, newParameter), new ReplaceVisitor().Modify(fl.Body, newParameter),
newParameter newParameter
); );
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 }); var whereSql = ExpressionLambdaToSql(expExp.Body, new ExpTSC { _tables = null, _selectColumnMap = null, getSelectGroupingMapString = null, tbtype = SelectTableInfoType.From, isQuoteName = true, isDisableDiyParse = false, style = ExpressionStyle.Where, currentTable = tb.Table, alias001 = tb.Alias });
whereSql = GetBoolString(expExp.Body, whereSql);
if (isEmpty == false) if (isEmpty == false)
sb.Append(" AND "); sb.Append(" AND ");
else else