Compare commits

...

15 Commits

Author SHA1 Message Date
sunkaixuan
1efdcc4abb Update 达梦 2025-11-06 09:35:43 +08:00
sunkaixuan
fc0d840bdd Update DynamicBuilder 2025-11-05 17:41:32 +08:00
sunkaixuan
d2aa296b26 Update gbase bug 2025-11-05 13:27:18 +08:00
果糖网
4db5842555 Merge pull request #1368 from idea-zone/master
add test for GetConfigValue
2025-11-05 11:07:41 +08:00
bug320
74aa0e71db feat: add test for GetConfigValue 2025-11-05 09:33:30 +08:00
sunkaixuan
5bdb351258 Update gbase8s 2025-11-04 19:09:57 +08:00
sunkaixuan
6d8bebbc36 - 2025-11-04 18:42:25 +08:00
sunkaixuan
cf17d9baec Update nuget 2025-11-04 18:42:15 +08:00
果糖网
41cadc1d15 Merge pull request #1367 from idea-zone/patch-1
exp to sql  allow SqlSugarColumn
2025-11-04 14:20:44 +08:00
idea-zone
83deab8295 exp to sql allow SqlSugarColumn 2025-11-04 11:58:33 +08:00
sunkaixuan
b596c69939 Merge branch 'master' of gitee.com:dotnetchina/SqlSugar 2025-11-04 09:11:44 +08:00
sunkaixuan
bb5d5a102a Update exp to sql 2025-11-04 09:03:42 +08:00
阿妮亚
f6be3b03da !102 Fix Vastbase BINARY format handling in PostgreSQL COPY command
Merge pull request !102 from yayaxxww/master
2025-11-03 03:58:37 +00:00
sunkaixuan
a88188383b Update Oracle 2025-11-02 11:06:35 +08:00
yayaxxww
a4986b475d Fix Vastbase BINARY format handling in PostgreSQL COPY command
Remove unnecessary MySQL compatibility check for Vastbase database, allowing BINARY format to be applied consistently across Vastbase configurations.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-31 15:45:20 +08:00
11 changed files with 241 additions and 18 deletions

View File

@@ -30,6 +30,7 @@ namespace OrmTest
_a7_JsonType.Init();
_a8_SelectReturnType.Init();
_a9_GeometryTest.Init();
b10_GetConfigValueTest.Init();
}
}

View File

@@ -0,0 +1,139 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace OrmTest
{
internal class b10_GetConfigValueTest
{
public static void Init()
{
// Get a new database instance
// 获取新的数据库实例
var db = DbHelper.GetNewDb();
// Create the database if it doesn't exist
// 如果数据库不存在,则创建数据库
db.DbMaintenance.CreateDatabase();
db.CodeFirst.InitTables<EavEntityType>();
db.CodeFirst.InitTables<SysDictType>();
db.CodeFirst.InitTables<SysDictData>();
// 清空表
db.DbMaintenance.TruncateTable<EavEntityType>();
db.DbMaintenance.TruncateTable<SysDictType>();
db.DbMaintenance.TruncateTable<SysDictData>();
// 插入数据
// 字典类型
db.Insertable(new SysDictType() { DictName = "系统是否", DictType = "sys_yes_no" }).ExecuteCommand();//用例代码
// 字典值
db.Insertable(new SysDictData() { DictLabel = "是", DictValue = "Y", DictType = "sys_yes_no" }).ExecuteCommand();//用例代码
db.Insertable(new SysDictData() { DictLabel = "否", DictValue = "N", DictType = "sys_yes_no" }).ExecuteCommand();//用例代码
// 实体类型
db.Insertable(new EavEntityType() { EntityTypeName = "人员", EntityTypeCode = "Human", IsActive = true }).ExecuteCommand();//用例代码
// 配置
var types = db.Queryable<SysDictType>()
.Select(it => it.DictType)
.ToList();
//上面有耗时操作写在Any上面保证程序启动后只执行一次
if (!db.ConfigQuery.Any())
{
foreach (var type in types)
{
//db.ConfigQuery.SetTable<SysDictData>(it => SqlFunc.ToString(it.DictValue), it => it.DictLabel, type, it => it.DictType == type);
db.ConfigQuery.SetTable<SysDictData>(it => it.DictValue.ToString(), it => it.DictLabel, type, it => it.DictType == type);
}
}
// 查询
var total = 0;
var result = db.Queryable<EavEntityType>().Select((it) => new
{
it,
IsActiveLabel = (it.IsActive ? "Y" : "N").GetConfigValue<SysDictData>("sys_yes_no"),
}, true)
.ToPageList(1, 100000, ref total);
}
}
[SugarTable("sys_dict_type", "字典类型表")]
[SugarIndex("index_dict_type", nameof(DictType), OrderByType.Asc, true)]
public class SysDictType
{
/// <summary>
/// 字典名称
/// </summary>
[SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)]
public string DictName { get; set; }
/// <summary>
/// 字典类型
/// </summary>
[SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)]
public string DictType { get; set; }
}
[SugarTable("sys_dict_data", "字典数据表")]
public class SysDictData
{
/// <summary>
/// 字典标签
/// </summary>
[SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)]
public string DictLabel { get; set; }
/// <summary>
/// 字典键值
/// </summary>
[SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)]
public string DictValue { get; set; }
/// <summary>
/// 字典类型
/// </summary>
[SugarColumn(Length = 100, ExtendedAttribute = ProteryConstant.NOTNULL)]
public string DictType { get; set; }
}
/// <summary>
/// 实体类型
/// </summary>
[SugarTable("eav_entity_type")]
public class EavEntityType
{
/// <summary>
/// 主键 主键自增ID
/// </summary>
[SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "entity_type_id")]
public int? EntityTypeId { get; set; }
/// <summary>
/// 代码 实体类型代码(如 product, user
/// </summary>
[SugarColumn(ColumnName = "entity_type_code")]
public string EntityTypeCode { get; set; }
/// <summary>
/// 名称 实体类型名称(如 产品, 用户))
/// </summary>
[SugarColumn(ColumnName = "entity_type_name")]
public string EntityTypeName { get; set; }
/// <summary>
/// 启用 是否启用该实体类型
/// </summary>
[SugarColumn(ColumnName = "is_active")]
public bool IsActive { get; set; }
}
public enum ProteryConstant
{
NOTNULL = 0
}
}

View File

@@ -2,7 +2,7 @@
<package >
<metadata>
<id>SqlSugar.MongoDbCore</id>
<version>5.1.4.259</version>
<version>5.1.4.271</version>
<authors>sunkaixuan</authors>
<owners>果糖大数据</owners>
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>
@@ -19,7 +19,7 @@
</dependencies>
</metadata>
<files>
<file src="G:\Git\SqlSugar\Src\Asp.NetCore2\SqlSugar.MongoDbCore\bin\Debug\netstandard2.1\SqlSugar.MongoDbCore.dll" target="lib\net6.0"></file>
<file src="G:\Git\SqlSugar\Src\Asp.NetCore2\SqlSugar.MongoDbCore\bin\Debug\netstandard2.1\MongoDb.Ado.Data.dll" target="lib\net6.0"></file>
<file src="G:\Git\SqlSugar\Src\Asp.NetCore2\SqlSugar.MongoDbCore\bin\Debug\netstandard2.1\SqlSugar.MongoDbCore.dll" target="lib\netstandard2.1"></file>
<file src="G:\Git\SqlSugar\Src\Asp.NetCore2\SqlSugar.MongoDbCore\bin\Debug\netstandard2.1\MongoDb.Ado.Data.dll" target="lib\netstandard2.1"></file>
</files>
</package>

View File

@@ -84,7 +84,8 @@ namespace SqlSugar
attributeType.GetProperty(nameof(SugarColumn.IsOwnsOne)),
attributeType.GetProperty(nameof(SugarColumn.InsertServerTime)),
attributeType.GetProperty(nameof(SugarColumn.UpdateServerTime)),
attributeType.GetProperty(nameof(SugarColumn.QuerySql))
attributeType.GetProperty(nameof(SugarColumn.QuerySql)),
attributeType.GetProperty(nameof(SugarColumn.CreateTableFieldSort))
}
, new object[] {
sugarTable.IsPrimaryKey,
@@ -112,7 +113,8 @@ namespace SqlSugar
sugarTable.IsOwnsOne,
sugarTable.InsertServerTime,
sugarTable.UpdateServerTime,
sugarTable.QuerySql
sugarTable.QuerySql,
sugarTable.CreateTableFieldSort
});
return attributeBuilder;
}

View File

@@ -799,6 +799,10 @@ namespace SqlSugar
foreach (var paramter in this.SubToListParameters)
{
var regex = $@"\{Builder.SqlTranslationLeft}[\w]{{1,20}}?\{Builder.SqlTranslationRight}\.\{Builder.SqlTranslationLeft}.{{1,50}}?\{Builder.SqlTranslationRight}";
if (Builder.SqlTranslationLeft == string.Empty)
{
regex = $@"[\w]{{1,20}}?\..{{1,50}}? ";
}
var matches = Regex
.Matches(paramter.Value.ObjToString(), regex, RegexOptions.IgnoreCase).Cast<Match>()
.Where(it => allShortName.Any(z => it.Value.ObjToString().ToLower().Contains(z)))

View File

@@ -641,6 +641,10 @@ namespace SqlSugar
{
ThrowUpdateByExpression();
var updateColumns = UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.ArraySingle).GetResultArray().Select(it => this.SqlBuilder.GetNoTranslationColumnName(it)).ToList();
if (this.SqlBuilder?.SqlTranslationLeft==string.Empty&&columns is LambdaExpression l && l.Body is UnaryExpression u&&u.Operand is MemberExpression m && m.Type == UtilConstants.BoolType)
{
updateColumns = new List<string> { UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.FieldSingle)?.GetResultString() };
}
if (this.UpdateBuilder.UpdateColumns == null)
{
this.UpdateBuilder.UpdateColumns = new List<string>();

View File

@@ -607,6 +607,31 @@ namespace SqlSugar
exp = (exp as UnaryExpression).Operand;
}
var member = exp as MemberExpression;
// TODO: 我这里只是简单判断 exp1 是否是表达式
object sqlCondition = null;
// 如果是表达式,按表达条件走
if (exp is ConditionalExpression exp1)
{
// TODO: 这里需要处理从表达转换为 SQL这里只是简单处理了
var model = new MethodCallExpressionModel() { Args = new List<MethodCallExpressionArgs>() };
member = exp1.Test as MemberExpression;
// 获取变量对应的 数据库列名
var it1 = member.Expression;
var type1 = it1.Type;
var properyName1 = member.Member.Name;
model.Args.Add(new MethodCallExpressionArgs() { MemberValue = exp1.Test, MemberName = this.Context.GetDbColumnName(type1.Name, properyName1) });
model.Args.Add(new MethodCallExpressionArgs() { MemberValue = exp1.IfTrue, MemberName = exp1.IfTrue });
model.Args.Add(new MethodCallExpressionArgs() { MemberValue = exp1.IfFalse, MemberName = exp1.IfFalse });
model.Expression = exp;
// 一个简单的,只处理 PgSql 返回类型的方式
sqlCondition = IIF_Ex(model);
}
var it = member.Expression;
var type = it.Type;
var properyName = member.Member.Name;
@@ -615,7 +640,17 @@ namespace SqlSugar
{
this.Context.SingleTableNameSubqueryShortName = it.ToString();
}
sql = string.Format(sql, entity.Value, this.Context.GetTranslationColumnName(entity.TableName), entity.Key, eqName);
// TODO: 根据变化重新拼接
if (sqlCondition == null)
{
sql = string.Format(sql, entity.Value, this.Context.GetTranslationColumnName(entity.TableName), entity.Key, eqName);
}
else
{
sql = string.Format(sql, entity.Value, this.Context.GetTranslationColumnName(entity.TableName), entity.Key, sqlCondition);
}
if (entity.Parameter != null)
{
foreach (var item in entity.Parameter)
@@ -641,6 +676,36 @@ namespace SqlSugar
AppendMember(parameter, parameter.IsLeft, sql);
}
}
string IIF_Ex(MethodCallExpressionModel model)
{
var parameter = model.Args[0];
var parameter2 = model.Args[1];
var parameter3 = model.Args[2];
var ifTrue = parameter2.MemberName.ObjToString();
var ifFalse = parameter3.MemberName.ObjToString();
if (ifTrue == ifFalse)
{
return $" {parameter2.MemberName} ";
}
if (model.Parameters != null
&& model.Conext != null
&& ifTrue.StartsWith(model.Conext?.SqlParameterKeyWord)
&& ifFalse.StartsWith(model.Conext?.SqlParameterKeyWord))
{
var p2 = model.Parameters.Where(it => it.ParameterName != null).FirstOrDefault(it => it.ParameterName.Equals(ifTrue));
var p3 = model.Parameters.Where(it => it.ParameterName != null).FirstOrDefault(it => it.ParameterName.Equals(ifFalse));
if (p2 != null && p3 != null)
{
if (p2.Value?.Equals(p3.Value) == true)
{
model.Parameters.Remove(p3);
return $" {parameter2.MemberName} ";
}
}
}
return string.Format("( CASE WHEN {0} THEN N'{1}' ELSE N'{2}' END )", parameter.MemberName.ToString().ToLower(), parameter2.MemberName.ToString().Trim('\"'), parameter3.MemberName.ToString().Trim('\"'));
}
private object GetMethodValue(string name, MethodCallExpressionModel model)
{
model.Parameters = this.Context.Parameters;

View File

@@ -206,23 +206,26 @@ namespace SqlSugar
}
private static string[] KeyWord =new string []{ ":asc", "@asc", ":desc", "@desc","@month", ":month", ":day","@day","@group", ":group",":index", "@index", "@order", ":order", "@user", "@level", ":user", ":level",":type","@type", ":year", "@year" };
private static string ReplaceKeyWordParameterName(string sql, SugarParameter[] parameters)
private string ReplaceKeyWordParameterName(string sql, SugarParameter[] parameters)
{
sql = ReplaceKeyWordWithAd(sql, parameters);
if (parameters.HasValue() && parameters.Count(it => it.ParameterName.ToLower().IsIn(KeyWord))>0)
if (parameters.HasValue() && this.CommandType != CommandType.StoredProcedure)
{
int i = 0;
foreach (var Parameter in parameters.OrderByDescending(it=>it.ParameterName.Length))
if (parameters.HasValue() && parameters.Count(it => it.ParameterName.ToLower().IsIn(KeyWord)) > 0)
{
if (Parameter.ParameterName != null && Parameter.ParameterName.ToLower().IsContainsIn(KeyWord))
int i = 0;
foreach (var Parameter in parameters.OrderByDescending(it => it.ParameterName.Length))
{
var newName = ":p" + i + 100;
sql = Regex.Replace(sql, Parameter.ParameterName, newName, RegexOptions.IgnoreCase);
Parameter.ParameterName = newName;
i++;
if (Parameter.ParameterName != null && Parameter.ParameterName.ToLower().IsContainsIn(KeyWord))
{
var newName = ":p" + i + 100;
sql = Regex.Replace(sql, Parameter.ParameterName, newName, RegexOptions.IgnoreCase);
Parameter.ParameterName = newName;
i++;
}
}
}
}
}
return sql;
}

View File

@@ -106,6 +106,11 @@ namespace SqlSugar
result = $" {sql.ToString()} {(this.WhereInfos.Any()?"AND":"WHERE")} ROWNUM = 1 ";
result = result.Replace(rowNumberString, " ");
}
if (!string.IsNullOrEmpty(this.TranLock)&&this.GetGroupByString == null && this.Take >1 && this.Skip == null && oldOrderBy == null)
{
result = $" {sql.ToString()} {(this.WhereInfos.Any() ? "AND" : "WHERE")} ROWNUM <= {this.Take} ";
result = result.Replace(rowNumberString, " ");
}
if (ExternalPageIndex > 0)
{
if (externalOrderBy.IsNullOrEmpty())

View File

@@ -41,7 +41,7 @@ namespace SqlSugar
string copyString = $"COPY {dt.TableName} ( {string.Join(",", lsColNames)} ) FROM STDIN (FORMAT BINARY)";
var innertemp = this.Context.CurrentConnectionConfig?.MoreSettings?.InnerTemp as DbType?;
if (this.Context?.CurrentConnectionConfig?.MoreSettings?.DatabaseModel == DbType.OpenGauss ||
(this.Context?.CurrentConnectionConfig?.MoreSettings?.DatabaseModel == DbType.Vastbase && innertemp == DbType.MySql))
this.Context?.CurrentConnectionConfig?.MoreSettings?.DatabaseModel == DbType.Vastbase)
{
copyString = copyString.Replace("(FORMAT BINARY)", "(FORMAT 'BINARY')");
}

View File

@@ -2,7 +2,7 @@
<package >
<metadata>
<id>SqlSugarCore</id>
<version>5.1.4.207</version>
<version>5.1.4.208-preview10</version>
<authors>sunkaixuan</authors>
<owners>果糖大数据科技</owners>
<licenseUrl>http://www.apache.org/licenses/LICENSE-2.0.html</licenseUrl>