diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs
index a381b2fa..b3ee6661 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs
@@ -725,15 +725,15 @@ namespace FreeSql.Tests.Odbc.Default
[Fact]
public void Sum()
{
- var subquery = select.ToSql(a => new
+ var subquery = select.Where(a => a.Id < 200).ToSql(a => new
{
all = a,
- count = select.Sum(b => b.Id)
+ count = select.Where(b => b.Id < 200).Sum(b => b.Id)
});
- var subqueryList = select.ToList(a => new
+ var subqueryList = select.Where(a => a.Id < 200).ToList(a => new
{
all = a,
- count = select.Sum(b => b.Id)
+ count = select.Where(b => b.Id < 200).Sum(b => b.Id)
});
}
[Fact]
@@ -767,15 +767,15 @@ namespace FreeSql.Tests.Odbc.Default
[Fact]
public void Avg()
{
- var subquery = select.ToSql(a => new
+ var subquery = select.Where(a => a.Id < 200).ToSql(a => new
{
all = a,
- count = select.Avg(b => b.Id)
+ count = select.Where(b => b.Id < 200).Sum(b => b.Id)
});
- var subqueryList = select.ToList(a => new
+ var subqueryList = select.Where(a => a.Id < 200).ToList(a => new
{
all = a,
- count = select.Avg(b => b.Id)
+ count = select.Where(b => b.Id < 200).Sum(b => b.Id)
});
}
[Fact]
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/MapType/BoolNullableTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/MapType/BoolNullableTest.cs
index b13d90e9..ec8f5d6a 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/MapType/BoolNullableTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/MapType/BoolNullableTest.cs
@@ -1567,30 +1567,5 @@ namespace FreeSql.Tests.Odbc.DefaultMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/MapType/BoolTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/MapType/BoolTest.cs
index cf68b373..544aca1d 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/MapType/BoolTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/MapType/BoolTest.cs
@@ -1100,30 +1100,5 @@ namespace FreeSql.Tests.Odbc.DefaultMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/MapType/BoolNullableTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/MapType/BoolNullableTest.cs
index e2c5c4ee..e6f685a6 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/MapType/BoolNullableTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/MapType/BoolNullableTest.cs
@@ -1567,30 +1567,5 @@ namespace FreeSql.Tests.Odbc.OracleMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/MapType/BoolTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/MapType/BoolTest.cs
index decd881f..54ee44e8 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/MapType/BoolTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/MapType/BoolTest.cs
@@ -1101,30 +1101,5 @@ namespace FreeSql.Tests.Odbc.OracleMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/MapType/BoolNullableTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/MapType/BoolNullableTest.cs
index 0c8c0d7f..c9e0dcce 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/MapType/BoolNullableTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/MapType/BoolNullableTest.cs
@@ -1567,30 +1567,5 @@ namespace FreeSql.Tests.Odbc.PostgreSQLMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/MapType/BoolTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/MapType/BoolTest.cs
index a91a204f..b88d79a9 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/MapType/BoolTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/MapType/BoolTest.cs
@@ -1101,30 +1101,5 @@ namespace FreeSql.Tests.Odbc.PostgreSQLMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs
index 0174b4aa..d604deeb 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs
@@ -706,15 +706,15 @@ namespace FreeSql.Tests.Odbc.SqlServer
[Fact]
public void Sum()
{
- var subquery = select.ToSql(a => new
+ var subquery = select.Where(a => a.Id < 200).ToSql(a => new
{
all = a,
- count = select.Sum(b => b.Id)
+ count = select.Where(b => b.Id < 200).Sum(b => b.Id)
});
- var subqueryList = select.ToList(a => new
+ var subqueryList = select.Where(a => a.Id < 200).ToList(a => new
{
all = a,
- count = select.Sum(b => b.Id)
+ count = select.Where(b => b.Id < 200).Sum(b => b.Id)
});
}
[Fact]
@@ -748,15 +748,15 @@ namespace FreeSql.Tests.Odbc.SqlServer
[Fact]
public void Avg()
{
- var subquery = select.ToSql(a => new
+ var subquery = select.Where(a => a.Id < 100).ToSql(a => new
{
all = a,
- count = select.Avg(b => b.Id)
+ count = select.Where(b => b.Id < 100).Avg(b => b.Id)
});
- var subqueryList = select.ToList(a => new
+ var subqueryList = select.Where(a => a.Id < 100).ToList(a => new
{
all = a,
- count = select.Avg(b => b.Id)
+ count = select.Where(b => b.Id < 100).Avg(b => b.Id)
});
}
[Fact]
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/MapType/BoolNullableTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/MapType/BoolNullableTest.cs
index 328f733b..ee59233e 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/MapType/BoolNullableTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/MapType/BoolNullableTest.cs
@@ -1568,30 +1568,5 @@ namespace FreeSql.Tests.Odbc.SqlServerMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/MapType/BoolTest.cs b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/MapType/BoolTest.cs
index b7ec3e4e..5d152b19 100644
--- a/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/MapType/BoolTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/MapType/BoolTest.cs
@@ -1101,30 +1101,5 @@ namespace FreeSql.Tests.Odbc.SqlServerMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml
index 6e6ec049..d0b42783 100644
--- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml
+++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml
@@ -204,6 +204,14 @@
回复的文本内容
+
+
+ 设置表达式中的 string 参数化长度,优化执行计划
+
+
+
+
+
调价单
diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/MapType/BoolNullableTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/MapType/BoolNullableTest.cs
index d3da1a49..0224c6c5 100644
--- a/FreeSql.Tests/FreeSql.Tests/Oracle/MapType/BoolNullableTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Oracle/MapType/BoolNullableTest.cs
@@ -1567,30 +1567,5 @@ namespace FreeSql.Tests.OracleMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests/Oracle/MapType/BoolTest.cs b/FreeSql.Tests/FreeSql.Tests/Oracle/MapType/BoolTest.cs
index 0aab5f9f..d0dd9c37 100644
--- a/FreeSql.Tests/FreeSql.Tests/Oracle/MapType/BoolTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Oracle/MapType/BoolTest.cs
@@ -1101,30 +1101,5 @@ namespace FreeSql.Tests.OracleMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/MapType/BoolNullableTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/MapType/BoolNullableTest.cs
index 73804ba1..2a5038d9 100644
--- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/MapType/BoolNullableTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/MapType/BoolNullableTest.cs
@@ -1567,30 +1567,5 @@ namespace FreeSql.Tests.PostgreSQLMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/MapType/BoolTest.cs b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/MapType/BoolTest.cs
index 37ce2ca4..574facca 100644
--- a/FreeSql.Tests/FreeSql.Tests/PostgreSQL/MapType/BoolTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/PostgreSQL/MapType/BoolTest.cs
@@ -1101,30 +1101,5 @@ namespace FreeSql.Tests.PostgreSQLMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/MapType/BoolNullableTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/MapType/BoolNullableTest.cs
index ad683985..86552fc1 100644
--- a/FreeSql.Tests/FreeSql.Tests/SqlServer/MapType/BoolNullableTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/MapType/BoolNullableTest.cs
@@ -1577,30 +1577,5 @@ namespace FreeSql.Tests.SqlServerMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/MapType/BoolTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/MapType/BoolTest.cs
index 9d3e5d46..7c5ab8ff 100644
--- a/FreeSql.Tests/FreeSql.Tests/SqlServer/MapType/BoolTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/MapType/BoolTest.cs
@@ -1110,30 +1110,5 @@ namespace FreeSql.Tests.SqlServerMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/MapType/BoolNullableTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/MapType/BoolNullableTest.cs
index 1d261272..78d46bd2 100644
--- a/FreeSql.Tests/FreeSql.Tests/Sqlite/MapType/BoolNullableTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/MapType/BoolNullableTest.cs
@@ -1567,30 +1567,5 @@ namespace FreeSql.Tests.SqliteMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/MapType/BoolTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/MapType/BoolTest.cs
index 846817f5..367910bd 100644
--- a/FreeSql.Tests/FreeSql.Tests/Sqlite/MapType/BoolTest.cs
+++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/MapType/BoolTest.cs
@@ -1101,30 +1101,5 @@ namespace FreeSql.Tests.SqliteMapType
public void GuidNullable()
{
}
-
- [Fact]
- public void MygisPoint()
- {
- }
- [Fact]
- public void MygisLineString()
- {
- }
- [Fact]
- public void MygisPolygon()
- {
- }
- [Fact]
- public void MygisMultiPoint()
- {
- }
- [Fact]
- public void MygisMultiLineString()
- {
- }
- [Fact]
- public void MygisMultiPolygon()
- {
- }
}
}
diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs
index 97b4b8d1..1f809d0f 100644
--- a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs
+++ b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs
@@ -185,8 +185,6 @@ namespace FreeSql.Tests
[Fact]
public void Test02()
{
- var testparmSelect = g.sqlserver.Select().Where(a => a.nvarchar == "11" && a.nvarchar_notnull == "22" && a.nvarchar_null == "33" && a.varchar == "11" && a.varchar_notnull == "22" && a.varchar_null == "33");
-
var slsksd = g.mysql.Update().SetSource(new UserLike { Id = Guid.NewGuid(), CreateUserId = 1000, SubjectId = Guid.NewGuid() })
.UpdateColumns(a => new
{
@@ -291,6 +289,57 @@ namespace FreeSql.Tests
var sql = g.sqlite.Select()
.ToSql(a => a.CreateTime.FormatDateTime("yyyy-MM-dd"));
+
+
+ var parm1 = "11";
+ var parm2 = "22";
+ var parm3 = "33";
+ var testparmSelect = g.sqlserver.Select()
+ .Where(a =>
+ a.nvarchar == "11" &&
+ a.nvarchar_notnull == "22" &&
+ a.nvarchar_null == "33" &&
+ a.varchar == "11" &&
+ a.varchar_notnull == "22" &&
+ a.varchar_null == "33" &&
+
+ a.nvarchar == parm1 &&
+ a.nvarchar_notnull == parm2 &&
+ a.nvarchar_null == parm3 &&
+ a.varchar == parm3 &&
+ a.varchar_notnull == parm2 &&
+ a.varchar_null == parm3 &&
+
+ a.nvarchar == parm1.SetDbParameter(10) &&
+ a.nvarchar_notnull == parm2.SetDbParameter(11) &&
+ a.nvarchar_null == parm3.SetDbParameter(12) &&
+ a.varchar == parm3.SetDbParameter(13) &&
+ a.varchar_notnull == parm2.SetDbParameter(14) &&
+ a.varchar_null == parm3.SetDbParameter(15) &&
+
+
+ "11" == a.nvarchar &&
+ "22" == a.nvarchar_notnull &&
+ "33" == a.nvarchar_null &&
+ "11" == a.varchar &&
+ "22" == a.varchar_notnull &&
+ "33" == a.varchar_null &&
+
+ parm1 == a.nvarchar &&
+ parm2 == a.nvarchar_notnull &&
+ parm3 == a.nvarchar_null &&
+ parm1 == a.varchar &&
+ parm2 == a.varchar_notnull &&
+ parm3 == a.varchar_null &&
+
+ parm1.SetDbParameter(10) == a.nvarchar &&
+ parm2.SetDbParameter(11) == a.nvarchar_notnull &&
+ parm3.SetDbParameter(12) == a.nvarchar_null &&
+ parm1.SetDbParameter(13) == a.varchar &&
+ parm2.SetDbParameter(14) == a.varchar_notnull &&
+ parm3.SetDbParameter(15) == a.varchar_null
+
+ );
}
}
@@ -301,7 +350,20 @@ namespace FreeSql.Tests
public static string FormatDateTime(this DateTime that, string arg1)
{
- return $"date_format({context.Value.Values["arg1"]})";
+ return $"date_format({context.Value.Values["that"]}, {context.Value.Values["arg1"]})";
+ }
+
+ ///
+ /// 设置表达式中的 string 参数化长度,优化执行计划
+ ///
+ ///
+ ///
+ ///
+ public static string SetDbParameter(this string that, int size)
+ {
+ if (context.Value.DbParameter != null)
+ context.Value.DbParameter.Size = size;
+ return context.Value.Values["that"];
}
}
}
diff --git a/FreeSql/DataAnnotations/ExpressionCallAttribute.cs b/FreeSql/DataAnnotations/ExpressionCallAttribute.cs
index 4cd22f54..3c27b078 100644
--- a/FreeSql/DataAnnotations/ExpressionCallAttribute.cs
+++ b/FreeSql/DataAnnotations/ExpressionCallAttribute.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Data.Common;
using System.Text;
namespace FreeSql.DataAnnotations
@@ -18,11 +19,16 @@ namespace FreeSql.DataAnnotations
///
/// 数据库类型,可用于适配多种数据库环境
///
- public DataType DataType { get; set; }
+ public DataType DataType { get; internal set; }
///
/// 已解析的表达式中参数内容
///
public Dictionary Values { get; } = new Dictionary();
+
+ ///
+ /// 主对象的参数化对象,可重塑其属性
+ ///
+ public DbParameter DbParameter { get; internal set; }
}
}
diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
index 1bea2b5d..9a2604b7 100644
--- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
+++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs
@@ -128,16 +128,9 @@ public static partial class FreeSqlGlobalExtensions
///
///
///
- public static ISelect AsSelect(this IEnumerable that) where TEntity : class
- {
- throw new NotImplementedException();
- }
- public static ISelect AsSelect(this IEnumerable that, IFreeSql orm = null) where TEntity : class
- {
- return orm?.Select();
- }
-
- public static FreeSql.ISelect Queryable(this IFreeSql freesql) where T : class => freesql.Select();
+ public static ISelect AsSelect(this IEnumerable that) where TEntity : class => throw new NotImplementedException();
+ public static ISelect AsSelect(this IEnumerable that, IFreeSql orm = null) where TEntity : class => orm?.Select();
+ public static ISelect Queryable(this IFreeSql freesql) where T : class => freesql.Select();
#region 多表查询
///
diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml
index 56b67dc0..dbe7beb2 100644
--- a/FreeSql/FreeSql.xml
+++ b/FreeSql/FreeSql.xml
@@ -168,6 +168,11 @@
已解析的表达式中参数内容
+
+
+ 主对象的参数化对象,可重塑其属性
+
+
索引名
@@ -587,6 +592,13 @@
+
+
+ 是否生成命令参数化执行,针对 lambda 表达式解析
+
+
+
+
延时加载导航属性对象,导航属性需要声明 virtual
@@ -2282,156 +2294,7 @@
- 耗时(单位:毫秒)
-
-
-
-
- 标识符,可将 SyncStructureBeforeEventArgs 与 SyncStructureAfterEventArgs 进行匹配
-
-
-
-
- 实体类型
-
-
-
-
- 执行的 SQL
-
-
-
-
- 发生的错误
-
-
-
-
- 耗时(单位:Ticks)
-
-
-
-
- 耗时(单位:毫秒)
-
-
-
-
- 类型
-
-
-
-
- 属性列的元数据
-
-
-
-
- 反射的属性信息
-
-
-
-
- 获取实体的属性值,也可以设置实体的属性新值
-
-
-
-
- 【开发环境必备】自动同步实体结构到数据库,程序运行中检查实体表是否存在,然后创建或修改
-
-
-
-
- 转小写同步结构
-
-
-
-
- 转大写同步结构
-
-
-
-
- 将数据库的主键、自增、索引设置导入,适用 DbFirst 模式,无须在实体类型上设置 [Column(IsPrimary)] 或者 ConfigEntity。此功能目前可用于 mysql/sqlserver/postgresql/oracle。
- 本功能会影响 IFreeSql 首次访问的速度。
- 若使用 CodeFirst 创建索引后,又直接在数据库上建了索引,若无本功能下一次 CodeFirst 迁移时数据库上创建的索引将被删除
-
-
-
-
- 不使用命令参数化执行,针对 Insert/Update
-
-
-
-
- 延时加载导航属性对象,导航属性需要声明 virtual
-
-
-
-
- 将实体类型与数据库对比,返回DDL语句
-
-
-
-
-
-
- 将实体类型集合与数据库对比,返回DDL语句
-
- 实体类型
-
-
-
-
- 将实体类型与数据库对比,返回DDL语句(指定表名)
-
- 实体类型
- 指定表名对比
-
-
-
-
- 同步实体类型到数据库
-
-
-
-
-
-
- 同步实体类型集合到数据库
-
-
-
-
-
-
- 同步实体类型到数据库(指定表名)
-
- 实体类型
- 指定表名对比
-
-
-
-
- 根据 System.Type 获取数据库信息
-
-
-
-
-
-
- 在外部配置实体的特性
-
-
-
-
-
-
-
- 在外部配置实体的特性
-
-
-
+ 耗时(单位:毫秒
@@ -2626,6 +2489,165 @@
+
+
+ 多表查询
+
+
+
+
+
+
+
+ 获取c#值
+
+
+
+
+
+
+ 获取c#类型,int、long
+
+
+
+
+
+
+ 获取c#类型对象
+
+
+
+
+
+
+ 获取ado.net读取方法, GetBoolean、GetInt64
+
+
+
+
+
+
+ 序列化
+
+
+
+
+
+
+ 反序列化
+
+
+
+
+
+
+ 获取数据库枚举类型,适用 PostgreSQL
+
+
+
+
+
+
+ AsType, Ctor, ClearData 三处地方需要重新加载
+
+
+
+
+ AsType, Ctor, ClearData 三处地方需要重新加载
+
+
+
+
+ 通过属性的注释文本,通过 xml 读取
+
+
+ Dict:key=属性名,value=注释
+
+
+
+ 创建一个过滤器
+
+
+ 名字
+ 表达式
+
+
+
+
+ 中间表,多对多
+
+
+
+
+ 不进行任何处理
+
+
+
+
+ 将帕斯卡命名字符串转换为下划线分隔字符串
+
+ BigApple -> Big_Apple
+
+
+
+
+ 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全大写
+
+ BigApple -> BIG_APPLE
+
+
+
+
+ 将帕斯卡命名字符串转换为下划线分隔字符串,且转换为全小写
+
+ BigApple -> big_apple
+
+
+
+
+ 将字符串转换为大写
+
+ BigApple -> BIGAPPLE
+
+
+
+
+ 将字符串转换为小写
+
+ BigApple -> bigapple
+
+
+
+
+ 将帕斯卡命名字符串转换为下划线分隔字符串
+
+ BigApple -> Big_Apple
+
+
+
+
+
+
+ 测量两个经纬度的距离,返回单位:米
+
+ 经纬坐标1
+ 经纬坐标2
+ 返回距离(单位:米)
+
+
+
+ 将 IEnumable<T> 转成 ISelect<T>,以便使用 FreeSql 的查询功能。此方法用于 Lambad 表达式中,快速进行集合导航的查询。
+
+
+
+
+
+
+
+ 多表查询
+
+
+
多表查询
diff --git a/FreeSql/FreeSqlBuilder.cs b/FreeSql/FreeSqlBuilder.cs
index f7e979ca..fb754ac8 100644
--- a/FreeSql/FreeSqlBuilder.cs
+++ b/FreeSql/FreeSqlBuilder.cs
@@ -17,6 +17,7 @@ namespace FreeSql
bool _isSyncStructureToUpper = false;
bool _isConfigEntityFromDbFirst = false;
bool _isNoneCommandParameter = false;
+ bool _isGenerateCommandParameterWithLambda = false;
bool _isLazyLoading = false;
StringConvertType _entityPropertyConvertType = StringConvertType.None;
Action _aopCommandExecuting = null;
@@ -100,6 +101,16 @@ namespace FreeSql
return this;
}
///
+ /// 是否生成命令参数化执行,针对 lambda 表达式解析
+ ///
+ ///
+ ///
+ public FreeSqlBuilder UseGenerateCommandParameterWithLambda(bool value)
+ {
+ _isGenerateCommandParameterWithLambda = value;
+ return this;
+ }
+ ///
/// 延时加载导航属性对象,导航属性需要声明 virtual
///
///
diff --git a/FreeSql/Interface/ICodeFirst.cs b/FreeSql/Interface/ICodeFirst.cs
index e79fe7cc..2d1cec92 100644
--- a/FreeSql/Interface/ICodeFirst.cs
+++ b/FreeSql/Interface/ICodeFirst.cs
@@ -31,6 +31,10 @@ namespace FreeSql
///
bool IsNoneCommandParameter { get; set; }
///
+ /// 是否生成命令参数化执行,针对 lambda 表达式解析
+ ///
+ bool IsGenerateCommandParameterWithLambda { get; set; }
+ ///
/// 延时加载导航属性对象,导航属性需要声明 virtual
///
bool IsLazyLoading { get; set; }
diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs
index 3bb464b3..6cc728e0 100644
--- a/FreeSql/Internal/CommonExpression.cs
+++ b/FreeSql/Internal/CommonExpression.cs
@@ -423,13 +423,14 @@ namespace FreeSql.Internal
return $"({ExpressionLambdaToSql(leftExp, tsc)} {oper} {ExpressionLambdaToSql(rightExp, tsc)})";
}
+ Type oldMapType = null;
var left = ExpressionLambdaToSql(leftExp, tsc);
var leftMapColumn = SearchColumnByField(tsc._tables, tsc.currentTable, left);
var isLeftMapType = leftMapColumn != null && new[] { "AND", "OR" }.Contains(oper) == false && (leftMapColumn.Attribute.MapType != rightExp.Type || leftMapColumn.CsType != rightExp.Type);
ColumnInfo rightMapColumn = null;
var isRightMapType = false;
- if (isLeftMapType) tsc.mapType = leftMapColumn.Attribute.MapType;
-
+ if (isLeftMapType) oldMapType = tsc.SetMapTypeReturnOld(leftMapColumn.Attribute.MapType);
+
var right = ExpressionLambdaToSql(rightExp, tsc);
if (right != "NULL" && isLeftMapType)
{
@@ -443,7 +444,7 @@ namespace FreeSql.Internal
isRightMapType = rightMapColumn != null && new[] { "AND", "OR" }.Contains(oper) == false && (rightMapColumn.Attribute.MapType != leftExp.Type || rightMapColumn.CsType != leftExp.Type);
if (isRightMapType)
{
- tsc.mapType = rightMapColumn.Attribute.MapType;
+ oldMapType = tsc.SetMapTypeReturnOld(rightMapColumn.Attribute.MapType);
left = ExpressionLambdaToSql(leftExp, tsc);
if (left != "NULL" && isRightMapType)
{
@@ -495,7 +496,7 @@ namespace FreeSql.Internal
else right = GetBoolString(right);
break;
}
- tsc.mapType = null;
+ tsc.SetMapColumnTmp(null).SetMapTypeReturnOld(oldMapType);
return $"{left} {oper} {right}";
}
static ConcurrentDictionary _dicTypeExistsExpressionCallAttribute = new ConcurrentDictionary();
@@ -532,7 +533,7 @@ namespace FreeSql.Internal
return ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc);
case ExpressionType.Negate:
case ExpressionType.NegateChecked: return "-" + ExpressionLambdaToSql((exp as UnaryExpression)?.Operand, tsc);
- case ExpressionType.Constant: return formatSql((exp as ConstantExpression)?.Value, tsc.mapType, tsc.mapColumnTmp, tsc.dbParams);
+ case ExpressionType.Constant: return formatSql((exp as ConstantExpression)?.Value, tsc.mapType, tsc.mapColumnTmp, null);
case ExpressionType.Conditional:
var condExp = exp as ConditionalExpression;
return $"case when {ExpressionLambdaToSql(condExp.Test, tsc)} then {ExpressionLambdaToSql(condExp.IfTrue, tsc)} else {ExpressionLambdaToSql(condExp.IfFalse, tsc)} end";
@@ -543,15 +544,21 @@ namespace FreeSql.Internal
{
var ecc = new ExpressionCallContext { DataType = _ado.DataType };
var exp3MethodParams = exp3.Method.GetParameters();
- for (var a = 0; a < exp3.Arguments.Count; a++)
+ var dbParamsIndex = tsc.dbParams?.Count;
+ ecc.Values.Add(exp3MethodParams[0].Name, ExpressionLambdaToSql(exp3.Arguments[0], tsc));
+ if (tsc.dbParams?.Count > dbParamsIndex) ecc.DbParameter = tsc.dbParams.Last();
+ List oldDbParams = tsc.dbParams;
+ tsc.dbParams = null;
+ for (var a = 1; a < exp3.Arguments.Count; a++)
if (exp3.Arguments[a].Type != typeof(ExpressionCallContext))
ecc.Values.Add(exp3MethodParams[a].Name, ExpressionLambdaToSql(exp3.Arguments[a], tsc));
+ tsc.dbParams = oldDbParams;
var exp3InvokeParams = new object[exp3.Arguments.Count];
for (var a = 0; a < exp3.Arguments.Count; a++)
{
if (exp3.Arguments[a].Type != typeof(ExpressionCallContext))
- exp3InvokeParams[a] = exp3.Arguments[a].Type.CreateInstanceGetDefaultValue();
+ exp3InvokeParams[a] = Utils.GetDataReaderValue(exp3.Arguments[a].Type, ecc.Values[exp3MethodParams[a].Name]);// exp3.Arguments[a].Type.CreateInstanceGetDefaultValue();
else
exp3InvokeParams[a] = ecc;
}
@@ -1321,13 +1328,13 @@ namespace FreeSql.Internal
public string formatSql(object obj, Type mapType, ColumnInfo mapColumn, List dbParams)
{
//参数化设置,日后优化
- //if (dbParams != null && mapColumn != null)
- //{
- // var paramName = $"exp_{dbParams.Count}";
- // var parm = _common.AppendParamter(dbParams, paramName, mapColumn, mapType ?? mapColumn.Attribute.MapType, mapType == null ? obj : Utils.GetDataReaderValue(mapType, obj));
- // _common.SetParameterSize(parm, mapColumn.Attribute.DbType, mapColumn);
- // return _common.QuoteParamterName(paramName);
- //}
+ if (dbParams != null)
+ {
+ var paramName = $"exp_{dbParams.Count}";
+ var parm = _common.AppendParamter(dbParams, paramName, mapColumn,
+ mapType ?? mapColumn?.Attribute.MapType ?? obj?.GetType(), mapType == null ? obj : Utils.GetDataReaderValue(mapType, obj));
+ return _common.QuoteParamterName(paramName);
+ }
return string.Concat(_ado.AddslashesProcessParam(obj, mapType, mapColumn));
}
}
diff --git a/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs b/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs
index 3ecb796a..cf1cf470 100644
--- a/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs
+++ b/FreeSql/Internal/CommonProvider/CodeFirstProvider.cs
@@ -32,6 +32,7 @@ namespace FreeSql.Internal.CommonProvider
public bool IsSyncStructureToUpper { get; set; } = false;
public bool IsConfigEntityFromDbFirst { get; set; } = false;
public virtual bool IsNoneCommandParameter { get; set; } = false;
+ public virtual bool IsGenerateCommandParameterWithLambda { get; set; } = false;
public bool IsLazyLoading { get; set; } = false;
public abstract (int type, string dbtype, string dbtypeFull, bool? isnullable, object defaultValue)? GetDbInfo(Type type);
diff --git a/FreeSql/Internal/CommonProvider/DeleteProvider.cs b/FreeSql/Internal/CommonProvider/DeleteProvider.cs
index 7bd56748..e2d816dc 100644
--- a/FreeSql/Internal/CommonProvider/DeleteProvider.cs
+++ b/FreeSql/Internal/CommonProvider/DeleteProvider.cs
@@ -22,7 +22,6 @@ namespace FreeSql.Internal.CommonProvider
protected int _whereTimes = 0;
protected List _whereGlobalFilter;
protected List _params = new List();
- protected bool _noneParameter;
protected DbTransaction _transaction;
protected DbConnection _connection;
@@ -32,7 +31,6 @@ namespace FreeSql.Internal.CommonProvider
_commonUtils = commonUtils;
_commonExpression = commonExpression;
_table = _commonUtils.GetTableByEntity(typeof(T1));
- _noneParameter = _orm.CodeFirst.IsNoneCommandParameter;
this.Where(_commonUtils.WhereObject(_table, "", dywhere));
if (_orm.CodeFirst.IsAutoSyncStructure && typeof(T1) != typeof(object)) _orm.CodeFirst.SyncStructure();
_whereGlobalFilter = _orm.GlobalFilter.GetFilters();
@@ -87,7 +85,7 @@ namespace FreeSql.Internal.CommonProvider
}
public abstract List ExecuteDeleted();
- public IDelete Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, exp?.Body, null, _noneParameter ? _params : null));
+ public IDelete Where(Expression> exp) => this.Where(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, exp?.Body, null, _orm.CodeFirst.IsGenerateCommandParameterWithLambda ? _params : null));
public IDelete Where(string sql, object parms = null)
{
if (string.IsNullOrEmpty(sql)) return this;
diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs
index 3e292a00..1135f7bd 100644
--- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs
+++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs
@@ -35,7 +35,6 @@ namespace FreeSql.Internal.CommonProvider
protected Action