From d1be9ec629714a9b16c49ce29e20a257562ce6eb Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Tue, 13 Jun 2023 13:18:15 +0800 Subject: [PATCH] update CustomDataType case --- Examples/base_entity/Program.cs | 49 +++++++++++++++++++ FreeSql.DbContext/DbSet/DbSet.cs | 2 + FreeSql.DbContext/DbSet/DbSetAsync.cs | 4 ++ FreeSql.DbContext/DbSet/DbSetSync.cs | 4 ++ FreeSql/Extensions/FreeSqlGlobalExtensions.cs | 13 ++++- FreeSql/Internal/CommonExpression.cs | 6 +++ .../CommonProvider/AdoProvider/AdoProvider.cs | 1 + .../AdoProvider/AdoProviderAsync.cs | 1 + .../CommonProvider/InsertOrUpdateProvider.cs | 1 + .../Internal/CommonProvider/InsertProvider.cs | 1 + .../SelectProvider/Select0Provider.cs | 7 +++ .../SelectProvider/SelectGroupingProvider.cs | 1 + FreeSql/Internal/UtilsExpressionTree.cs | 10 ++++ 13 files changed, 99 insertions(+), 1 deletion(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 60e0955f..8ba31a12 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -6,6 +6,7 @@ using FreeSql.Internal; using FreeSql.Internal.CommonProvider; using FreeSql.Internal.Model; using FreeSql.Odbc.Default; +using MessagePack; using Microsoft.Data.SqlClient; using NetTopologySuite.Geometries; using Newtonsoft.Json; @@ -601,7 +602,18 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + fsql.CodeFirst.GetTableByEntity(typeof(MFUser)).GetTableRef(nameof(MFUser.ExtInfo), true); + fsql.Delete().Where(a => true).ExecuteAffrows(); + fsql.Delete().Where(a => true).ExecuteAffrows(); + fsql.Delete().Where(a => true).ExecuteAffrows(); + fsql.Insert(new MFUser { Id = "1", Name = "user1", Pd = "pd1" }).ExecuteAffrows(); + fsql.Insert(new MFUserExt { MFUserId = "1", Addr = "addr1", Phone = "phone1" }).ExecuteAffrows(); + fsql.Insert(new MFToken { MFUserId = "1", EndTime = DateTime.Now.AddDays(1), Source = "source1", Token = "token1" }).ExecuteAffrows(); + var user = fsql.Select() + .Include(a => a.ExtInfo) + .InnerJoin((a, b) => a.Id == b.MFUserId) + .First(); var sqlastable1 = fsql.Select(101).AsTable((t, o) => "current_detail_230501").ToSql(); var sqlastable2 = fsql.Update(101).AsTable("current_detail_230501").Set(t => t.StatuId, 1).ToSql(); @@ -2397,4 +2409,41 @@ var sql11111 = fsql.Select() public int StatuId { get; set; } } + + [Table(DisableSyncStructure = true)] + public abstract class BaseEntity22 + { + [Column(Position = 1, IsPrimary = true)] + public TKey Id { get; set; } + } + + [Index("uk_name", "Name", true)] + public class MFUser : BaseEntity22 + { + public string Name { get; set; } + public string Pd { get; set; } + + [Navigate(nameof(Id))] + public MFUserExt ExtInfo { get; set; } + } + [Index("uk_id", "MFUserId", true)] + public class MFUserExt + { + [Column(IsPrimary = true)] + public string MFUserId { get; set; } + [Navigate(nameof(MFUserId))] + public MFUser User { get; set; } + + public string Phone { get; set; } + public string Addr { get; set; } + } + [Index("index_name", "MFUserId")] + [Index("index_token", "Token")] + public class MFToken : BaseEntity22 + { + public string MFUserId { get; set; } + public string Token { get; set; } + public string? Source { get; set; } + public DateTime EndTime { get; set; } + } } diff --git a/FreeSql.DbContext/DbSet/DbSet.cs b/FreeSql.DbContext/DbSet/DbSet.cs index e3613bed..b9a59ba8 100644 --- a/FreeSql.DbContext/DbSet/DbSet.cs +++ b/FreeSql.DbContext/DbSet/DbSet.cs @@ -325,8 +325,10 @@ namespace FreeSql { case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: case DataType.ShenTong: diff --git a/FreeSql.DbContext/DbSet/DbSetAsync.cs b/FreeSql.DbContext/DbSet/DbSetAsync.cs index 3566be9d..2cedd018 100644 --- a/FreeSql.DbContext/DbSet/DbSetAsync.cs +++ b/FreeSql.DbContext/DbSet/DbSetAsync.cs @@ -41,8 +41,10 @@ namespace FreeSql { case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: case DataType.ShenTong: @@ -107,8 +109,10 @@ namespace FreeSql { case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: case DataType.ShenTong: diff --git a/FreeSql.DbContext/DbSet/DbSetSync.cs b/FreeSql.DbContext/DbSet/DbSetSync.cs index e08ae803..5fbdccbc 100644 --- a/FreeSql.DbContext/DbSet/DbSetSync.cs +++ b/FreeSql.DbContext/DbSet/DbSetSync.cs @@ -39,8 +39,10 @@ namespace FreeSql { case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: case DataType.ShenTong: @@ -109,8 +111,10 @@ namespace FreeSql { case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: case DataType.ShenTong: diff --git a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs index 81a66788..ebf3ba07 100644 --- a/FreeSql/Extensions/FreeSqlGlobalExtensions.cs +++ b/FreeSql/Extensions/FreeSqlGlobalExtensions.cs @@ -671,6 +671,7 @@ public static partial class FreeSqlGlobalExtensions return select; case DataType.MySql: //MySql5.6 case DataType.OdbcMySql: + case DataType.CustomMySql: var mysqlConnectionString = select._orm.Ado?.ConnectionString ?? select._connection?.ConnectionString ?? ""; if (_dicMySqlVersion.TryGetValue(mysqlConnectionString, out var mysqlVersion) == false) { @@ -738,11 +739,13 @@ JOIN {select._commonUtils.QuoteSqlName(tbDbName)} a ON cte_tbc.cte_id = a.{selec { case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: case DataType.ShenTong: //神通测试未通过 case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: case DataType.Firebird: case DataType.ClickHouse: sql1ctePath = select._commonExpression.ExpressionWhereLambda(select._tables, select._tableRule, Expression.Call(typeof(Convert).GetMethod("ToString", new Type[] { typeof(string) }), pathSelector?.Body), select._diymemexpWithTempQuery, null, null); @@ -815,11 +818,13 @@ JOIN {select._commonUtils.QuoteSqlName(tbDbName)} a ON cte_tbc.cte_id = a.{selec { case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: case DataType.ShenTong: //神通测试未通过 case DataType.MySql: case DataType.OdbcMySql: + case DataType.CustomMySql: case DataType.Firebird: nsselsb.Append("RECURSIVE "); break; @@ -829,6 +834,7 @@ JOIN {select._commonUtils.QuoteSqlName(tbDbName)} a ON cte_tbc.cte_id = a.{selec { case DataType.Oracle: //[Err] ORA-32039: recursive WITH clause must have column alias list case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.Dameng: //递归 WITH 子句必须具有列别名列表 case DataType.OdbcDameng: case DataType.GBase: @@ -861,20 +867,24 @@ SELECT "); { case DataType.MySql: case DataType.OdbcMySql: + case DataType.CustomMySql: case DataType.ClickHouse: return that.OrderBy("rand()"); case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: return that.OrderBy("newid()"); case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: case DataType.ShenTong: return that.OrderBy("random()"); case DataType.Oracle: - case DataType.Dameng: case DataType.OdbcOracle: + case DataType.CustomOracle: + case DataType.Dameng: case DataType.OdbcDameng: return that.OrderBy("dbms_random.value"); case DataType.Sqlite: @@ -1322,6 +1332,7 @@ SELECT "); { case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.GBase: sql = $" SELECT {af.field} FROM dual"; break; diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 3e73ea95..adec61b2 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -56,6 +56,7 @@ namespace FreeSql.Internal { case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: return dbField.EndsWith(dbNestedField, StringComparison.CurrentCultureIgnoreCase); } return dbField.EndsWith(dbNestedField); @@ -1081,6 +1082,7 @@ namespace FreeSql.Internal { case DataType.MySql: case DataType.OdbcMySql: + case DataType.CustomMySql: exp3CsValue = exp3CsValue.Replace("\\\\", "\\"); break; } @@ -1286,6 +1288,7 @@ namespace FreeSql.Internal { case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.Dameng: case DataType.OdbcDameng: case DataType.GBase: @@ -1675,6 +1678,7 @@ namespace FreeSql.Internal { case DataType.MySql: case DataType.OdbcMySql: + case DataType.CustomMySql: case DataType.GBase: if (exp3.Method.Name == "ToList") return $"( SELECT * FROM ({sqlFirst.Replace(" \r\n", " \r\n ")}) ftblmt50 )"; @@ -2654,6 +2658,7 @@ namespace FreeSql.Internal { case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.Dameng: case DataType.OdbcDameng: case DataType.GBase: @@ -2775,6 +2780,7 @@ namespace FreeSql.Internal { case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.Dameng: case DataType.OdbcDameng: case DataType.GBase: diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs index 7a39120e..3d88842e 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProvider.cs @@ -110,6 +110,7 @@ namespace FreeSql.Internal.CommonProvider { case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.GBase: ExecuteNonQuery(null, null, CommandType.Text, " SELECT 1 FROM dual", commandTimeout); return true; diff --git a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs index 407da328..418b2bbe 100644 --- a/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs +++ b/FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderAsync.cs @@ -25,6 +25,7 @@ namespace FreeSql.Internal.CommonProvider { case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.GBase: await ExecuteNonQueryAsync(null, null, CommandType.Text, " SELECT 1 FROM dual", commandTimeout, null, cancellationToken); return true; diff --git a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs index a45373c5..e8ccd0b8 100644 --- a/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertOrUpdateProvider.cs @@ -286,6 +286,7 @@ namespace FreeSql.Internal.CommonProvider { case DataType.OdbcOracle: case DataType.Oracle: + case DataType.CustomOracle: case DataType.OdbcDameng: case DataType.Dameng: case DataType.GBase: diff --git a/FreeSql/Internal/CommonProvider/InsertProvider.cs b/FreeSql/Internal/CommonProvider/InsertProvider.cs index 00b7e065..ebce0379 100644 --- a/FreeSql/Internal/CommonProvider/InsertProvider.cs +++ b/FreeSql/Internal/CommonProvider/InsertProvider.cs @@ -723,6 +723,7 @@ namespace FreeSql.Internal.CommonProvider { case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: if (val?.Equals(DateTime.MinValue) == true) val = new DateTime(1970, 1, 1); break; } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 1f2d5e38..c1c4dfb4 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -736,6 +736,7 @@ namespace FreeSql.Internal.CommonProvider case DataType.OdbcDameng: //达梦不能这样 case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.Firebird: case DataType.GBase: break; @@ -792,6 +793,7 @@ namespace FreeSql.Internal.CommonProvider case DataType.OdbcDameng: //达梦不能这样 case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.Firebird: case DataType.GBase: break; @@ -826,6 +828,7 @@ namespace FreeSql.Internal.CommonProvider case DataType.OdbcDameng: //达梦不能这样 case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.Firebird: case DataType.GBase: break; @@ -1208,20 +1211,24 @@ namespace FreeSql.Internal.CommonProvider { case DataType.MySql: case DataType.OdbcMySql: + case DataType.CustomMySql: _tosqlAppendContent = $"{_tosqlAppendContent} for update"; break; case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: _aliasRule = (_, old) => $"{old} With(UpdLock, RowLock{(noawait ? ", NoWait" : "")})"; break; case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: _tosqlAppendContent = $"{_tosqlAppendContent} for update{(noawait ? " nowait" : "")}"; break; case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.Dameng: case DataType.OdbcDameng: _tosqlAppendContent = $"{_tosqlAppendContent} for update{(noawait ? " nowait" : "")}"; diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs index bdbedc77..fa7a28b0 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/SelectGroupingProvider.cs @@ -202,6 +202,7 @@ namespace FreeSql.Internal.CommonProvider { case DataType.Oracle: case DataType.OdbcOracle: + case DataType.CustomOracle: case DataType.Dameng: case DataType.OdbcDameng: //Oracle、Dameng 分组时,嵌套分页 case DataType.GBase: diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs index 2ff34c64..c6901bbc 100644 --- a/FreeSql/Internal/UtilsExpressionTree.cs +++ b/FreeSql/Internal/UtilsExpressionTree.cs @@ -248,6 +248,7 @@ namespace FreeSql.Internal { case DataType.MySql: case DataType.OdbcMySql: //处理毫秒 + case DataType.CustomMySql: var timeLength = 0; var mTimeLength = Regex.Match(colattr.DbType, @"(DATETIME|TIMESTAMP)\s*\((\d+)\)"); if (mTimeLength.Success) timeLength = int.Parse(mTimeLength.Groups[2].Value); @@ -276,17 +277,20 @@ namespace FreeSql.Internal { case DataType.MySql: case DataType.OdbcMySql: + case DataType.CustomMySql: if (strlen == -2) colattr.DbType = $"LONGTEXT{strNotNull}"; else if (strlen < 0) colattr.DbType = $"TEXT{strNotNull}"; else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); break; case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1(MAX)"); else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); break; case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: case DataType.ShenTong: @@ -294,6 +298,7 @@ namespace FreeSql.Internal else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); break; case DataType.Oracle: + case DataType.CustomOracle: if (strlen < 0) colattr.DbType = $"NCLOB{strNotNull}"; //v1.3.2+ https://github.com/dotnetcore/FreeSql/issues/259 else colattr.DbType = Regex.Replace(colattr.DbType, charPatten, $"$1({strlen})"); break; @@ -337,23 +342,27 @@ namespace FreeSql.Internal { case DataType.MySql: case DataType.OdbcMySql: + case DataType.CustomMySql: if (strlen == -2) colattr.DbType = $"LONGBLOB{strNotNull}"; else if (strlen < 0) colattr.DbType = $"BLOB{strNotNull}"; else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); break; case DataType.SqlServer: case DataType.OdbcSqlServer: + case DataType.CustomSqlServer: if (strlen < 0) colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1(MAX)"); else colattr.DbType = Regex.Replace(colattr.DbType, bytePatten, $"$1({strlen})"); break; case DataType.PostgreSQL: case DataType.OdbcPostgreSQL: + case DataType.CustomPostgreSQL: case DataType.KingbaseES: case DataType.OdbcKingbaseES: case DataType.ShenTong: //驱动引发的异常:“System.Data.OscarClient.OscarException”(位于 System.Data.OscarClient.dll 中) colattr.DbType = $"BYTEA{strNotNull}"; //变长二进制串 break; case DataType.Oracle: + case DataType.CustomOracle: colattr.DbType = $"BLOB{strNotNull}"; break; case DataType.Dameng: @@ -1667,6 +1676,7 @@ namespace FreeSql.Internal if (dr.IsDBNull(index)) return null; break; case DataType.MySql: + case DataType.CustomMySql: if (dr.GetFieldType(index).FullName == "MySqlConnector.MySqlDateTime") { if (dr.IsDBNull(index)) return null;