- 优化 表达式对整数除法的处理,解析为整除;

This commit is contained in:
28810 2019-09-06 14:48:37 +08:00
parent d51aef2aa9
commit d105041858
15 changed files with 110 additions and 7 deletions

View File

@ -17,6 +17,22 @@ namespace FreeSql.Tests.MySqlConnectorExpression
} }
[Fact]
public void Div()
{
var t1 = select.Where(a => a.testFieldInt / 3 > 3).Limit(10).ToList();
var t2 = select.Where(a => a.testFieldLong / 3 > 3).Limit(10).ToList();
var t3 = select.Where(a => a.testFieldShort / 3 > 3).Limit(10).ToList();
var t4 = select.Where(a => a.testFieldInt / 3.0 > 3).Limit(10).ToList();
var t5 = select.Where(a => a.testFieldLong / 3.0 > 3).Limit(10).ToList();
var t6 = select.Where(a => a.testFieldShort / 3.0 > 3).Limit(10).ToList();
var t7 = select.Where(a => a.testFieldDouble / 3 > 3).Limit(10).ToList();
var t8 = select.Where(a => a.testFieldDecimal / 3 > 3).Limit(10).ToList();
var t9 = select.Where(a => a.testFieldFloat / 3 > 3).Limit(10).ToList();
}
[Fact] [Fact]
public void Boolean() public void Boolean()
{ {

View File

@ -17,6 +17,22 @@ namespace FreeSql.Tests.MySqlExpression
} }
[Fact]
public void Div()
{
var t1 = select.Where(a => a.testFieldInt / 3 > 3).Limit(10).ToList();
var t2 = select.Where(a => a.testFieldLong / 3 > 3).Limit(10).ToList();
var t3 = select.Where(a => a.testFieldShort / 3 > 3).Limit(10).ToList();
var t4 = select.Where(a => a.testFieldInt / 3.0 > 3).Limit(10).ToList();
var t5 = select.Where(a => a.testFieldLong / 3.0 > 3).Limit(10).ToList();
var t6 = select.Where(a => a.testFieldShort / 3.0 > 3).Limit(10).ToList();
var t7 = select.Where(a => a.testFieldDouble / 3 > 3).Limit(10).ToList();
var t8 = select.Where(a => a.testFieldDecimal / 3 > 3).Limit(10).ToList();
var t9 = select.Where(a => a.testFieldFloat / 3 > 3).Limit(10).ToList();
}
[Fact] [Fact]
public void Boolean() public void Boolean()
{ {

View File

@ -15,6 +15,22 @@ namespace FreeSql.Tests.OracleExpression
{ {
} }
[Fact]
public void Div()
{
var t1 = select.Where(a => a.Int / 3 > 3).Limit(10).ToList();
var t2 = select.Where(a => a.Long / 3 > 3).Limit(10).ToList();
var t3 = select.Where(a => a.Short / 3 > 3).Limit(10).ToList();
var t4 = select.Where(a => a.Int / 3.0 > 3).Limit(10).ToList();
var t5 = select.Where(a => a.Long / 3.0 > 3).Limit(10).ToList();
var t6 = select.Where(a => a.Short / 3.0 > 3).Limit(10).ToList();
var t7 = select.Where(a => a.Double / 3 > 3).Limit(10).ToList();
var t8 = select.Where(a => a.Decimal / 3 > 3).Limit(10).ToList();
var t9 = select.Where(a => a.Float / 3 > 3).Limit(10).ToList();
}
[Fact] [Fact]
public void Boolean() public void Boolean()
{ {

View File

@ -24,6 +24,22 @@ namespace FreeSql.Tests.PostgreSQLExpression
NpgsqlConnection.GlobalTypeMapper.UseLegacyPostgis(); NpgsqlConnection.GlobalTypeMapper.UseLegacyPostgis();
} }
[Fact]
public void Div()
{
var t1 = select.Where(a => a.testFieldInt / 3 > 3).Limit(10).ToList();
var t2 = select.Where(a => a.testFieldLong / 3 > 3).Limit(10).ToList();
var t3 = select.Where(a => a.testFieldShort / 3 > 3).Limit(10).ToList();
var t4 = select.Where(a => a.testFieldInt / 3.0 > 3).Limit(10).ToList();
var t5 = select.Where(a => a.testFieldLong / 3.0 > 3).Limit(10).ToList();
var t6 = select.Where(a => a.testFieldShort / 3.0 > 3).Limit(10).ToList();
var t7 = select.Where(a => a.testFieldDouble / 3 > 3).Limit(10).ToList();
var t8 = select.Where(a => a.testFieldDecimal / 3 > 3).Limit(10).ToList();
var t9 = select.Where(a => a.testFieldFloat / 3 > 3).Limit(10).ToList();
}
[Fact] [Fact]
public void Boolean() public void Boolean()
{ {

View File

@ -20,6 +20,22 @@ namespace FreeSql.Tests.SqlServerExpression
ISelect<TableAllType> select => _sqlserverFixture.SqlServer.Select<TableAllType>(); ISelect<TableAllType> select => _sqlserverFixture.SqlServer.Select<TableAllType>();
[Fact]
public void Div()
{
var t1 = select.Where(a => a.testFieldInt / 3 > 3).Limit(10).ToList();
var t2 = select.Where(a => a.testFieldLong / 3 > 3).Limit(10).ToList();
var t3 = select.Where(a => a.testFieldShort / 3 > 3).Limit(10).ToList();
var t4 = select.Where(a => a.testFieldInt / 3.0 > 3).Limit(10).ToList();
var t5 = select.Where(a => a.testFieldLong / 3.0 > 3).Limit(10).ToList();
var t6 = select.Where(a => a.testFieldShort / 3.0 > 3).Limit(10).ToList();
var t7 = select.Where(a => a.testFieldDouble / 3 > 3).Limit(10).ToList();
var t8 = select.Where(a => a.testFieldDecimal / 3 > 3).Limit(10).ToList();
var t9 = select.Where(a => a.testFieldFloat / 3 > 3).Limit(10).ToList();
}
[Fact] [Fact]
public void Boolean() public void Boolean()
{ {

View File

@ -15,6 +15,22 @@ namespace FreeSql.Tests.SqliteExpression
{ {
} }
[Fact]
public void Div()
{
var t1 = select.Where(a => a.Int / 3 > 3).Limit(10).ToList();
var t2 = select.Where(a => a.Long / 3 > 3).Limit(10).ToList();
var t3 = select.Where(a => a.Short / 3 > 3).Limit(10).ToList();
var t4 = select.Where(a => a.Int / 3.0 > 3).Limit(10).ToList();
var t5 = select.Where(a => a.Long / 3.0 > 3).Limit(10).ToList();
var t6 = select.Where(a => a.Short / 3.0 > 3).Limit(10).ToList();
var t7 = select.Where(a => a.Double / 3 > 3).Limit(10).ToList();
var t8 = select.Where(a => a.Decimal / 3 > 3).Limit(10).ToList();
var t9 = select.Where(a => a.Float / 3 > 3).Limit(10).ToList();
}
[Fact] [Fact]
public void Boolean() public void Boolean()
{ {

View File

@ -405,7 +405,8 @@ namespace FreeSql.Tests
[Fact] [Fact]
public void Test1() public void Test1()
{ {
var floorSql = g.sqlite.Select<TaskBuild>().Where(a => a.OptionsEntity04 / 10000 == 121212 / 10000).ToSql(); var floorSql1 = g.mysql.Select<TaskBuild>().Where(a => a.OptionsEntity04 / 10000 == 121212 / 10000).ToSql();
var floorSql2 = g.mysql.Select<TaskBuild>().Where(a => a.OptionsEntity04 / 10000.0 == 121212 / 10000).ToSql();
var testBoolSql1 = g.sqlserver.Select<TaskBuild>().Where(a => a.OptionsEntity01).ToSql(); var testBoolSql1 = g.sqlserver.Select<TaskBuild>().Where(a => a.OptionsEntity01).ToSql();
var testBoolSql2 = g.sqlserver.Select<TaskBuild>().Where(a => a.Id == Guid.NewGuid() && a.OptionsEntity01).ToSql(); var testBoolSql2 = g.sqlserver.Select<TaskBuild>().Where(a => a.Id == Guid.NewGuid() && a.OptionsEntity01).ToSql();

View File

@ -483,6 +483,9 @@ namespace FreeSql.Internal
switch (oper) switch (oper)
{ {
case "%": return _common.Mod(left, right, leftExp.Type, rightExp.Type); case "%": return _common.Mod(left, right, leftExp.Type, rightExp.Type);
case "/":
if (leftExp.Type.IsIntegerType() && rightExp.Type.IsIntegerType()) return _common.Div(left, right, leftExp.Type, rightExp.Type);
break;
case "AND": case "AND":
case "OR": case "OR":
left = GetBoolString(left); left = GetBoolString(left);
@ -490,10 +493,6 @@ namespace FreeSql.Internal
break; break;
} }
tsc.mapType = null; tsc.mapType = null;
//switch(oper)
//{
// case "/": return ExpressionLambdaToSqlCallMath(Expression.Call(MethodMathFloor, Expression.Constant(1213.1d, typeof(double))), tsc)?.Replace("1213.1", $"{left} {oper} {right}");
//}
return $"{left} {oper} {right}"; return $"{left} {oper} {right}";
} }
public string ExpressionLambdaToSql(Expression exp, ExpTSC tsc) public string ExpressionLambdaToSql(Expression exp, ExpTSC tsc)

View File

@ -32,6 +32,7 @@ namespace FreeSql.Internal
public abstract string IsNull(string sql, object value); public abstract string IsNull(string sql, object value);
public abstract string StringConcat(string[] objs, Type[] types); public abstract string StringConcat(string[] objs, Type[] types);
public abstract string Mod(string left, string right, Type leftType, Type rightType); public abstract string Mod(string left, string right, Type leftType, Type rightType);
public abstract string Div(string left, string right, Type leftType, Type rightType);
public abstract string QuoteWriteParamter(Type type, string paramterName); public abstract string QuoteWriteParamter(Type type, string paramterName);
public abstract string QuoteReadColumn(Type type, string columnName); public abstract string QuoteReadColumn(Type type, string columnName);

View File

@ -74,6 +74,8 @@ namespace FreeSql.MySql
public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})"; public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})";
public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}";
public override string Div(string left, string right, Type leftType, Type rightType) => $"{left} div {right}";
public override string QuoteWriteParamter(Type type, string paramterName) public override string QuoteWriteParamter(Type type, string paramterName)
{ {
switch (type.FullName) switch (type.FullName)
@ -87,7 +89,6 @@ namespace FreeSql.MySql
} }
return paramterName; return paramterName;
} }
public override string QuoteReadColumn(Type type, string columnName) public override string QuoteReadColumn(Type type, string columnName)
{ {
switch (type.FullName) switch (type.FullName)

View File

@ -82,6 +82,8 @@ namespace FreeSql.MySql
public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})"; public override string StringConcat(string[] objs, Type[] types) => $"concat({string.Join(", ", objs)})";
public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}";
public override string Div(string left, string right, Type leftType, Type rightType) => $"{left} div {right}";
public override string QuoteWriteParamter(Type type, string paramterName) public override string QuoteWriteParamter(Type type, string paramterName)
{ {
switch (type.FullName) switch (type.FullName)
@ -95,7 +97,6 @@ namespace FreeSql.MySql
} }
return paramterName; return paramterName;
} }
public override string QuoteReadColumn(Type type, string columnName) public override string QuoteReadColumn(Type type, string columnName)
{ {
switch (type.FullName) switch (type.FullName)

View File

@ -64,6 +64,7 @@ namespace FreeSql.Oracle
public override string IsNull(string sql, object value) => $"nvl({sql}, {value})"; public override string IsNull(string sql, object value) => $"nvl({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";
public override string Mod(string left, string right, Type leftType, Type rightType) => $"mod({left}, {right})"; public override string Mod(string left, string right, Type leftType, Type rightType) => $"mod({left}, {right})";
public override string Div(string left, string right, Type leftType, Type rightType) => $"trunc({left} / {right})";
public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteWriteParamter(Type type, string paramterName) => paramterName;
public override string QuoteReadColumn(Type type, string columnName) => columnName; public override string QuoteReadColumn(Type type, string columnName) => columnName;

View File

@ -126,6 +126,7 @@ namespace FreeSql.PostgreSQL
public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})"; public override string IsNull(string sql, object value) => $"coalesce({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";
public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}";
public override string Div(string left, string right, Type leftType, Type rightType) => $"{left} / {right}";
public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteWriteParamter(Type type, string paramterName) => paramterName;
public override string QuoteReadColumn(Type type, string columnName) => columnName; public override string QuoteReadColumn(Type type, string columnName) => columnName;

View File

@ -66,6 +66,7 @@ namespace FreeSql.SqlServer
return string.Join(" + ", news); return string.Join(" + ", news);
} }
public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}";
public override string Div(string left, string right, Type leftType, Type rightType) => $"{left} / {right}";
public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteWriteParamter(Type type, string paramterName) => paramterName;
public override string QuoteReadColumn(Type type, string columnName) => columnName; public override string QuoteReadColumn(Type type, string columnName) => columnName;

View File

@ -79,6 +79,7 @@ namespace FreeSql.Sqlite
public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})"; public override string IsNull(string sql, object value) => $"ifnull({sql}, {value})";
public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}"; public override string StringConcat(string[] objs, Type[] types) => $"{string.Join(" || ", objs)}";
public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}"; public override string Mod(string left, string right, Type leftType, Type rightType) => $"{left} % {right}";
public override string Div(string left, string right, Type leftType, Type rightType) => $"{left} / {right}";
public override string QuoteWriteParamter(Type type, string paramterName) => paramterName; public override string QuoteWriteParamter(Type type, string paramterName) => paramterName;
public override string QuoteReadColumn(Type type, string columnName) => columnName; public override string QuoteReadColumn(Type type, string columnName) => columnName;