Optimize the code

This commit is contained in:
sunkaixuan 2025-06-26 10:38:58 +08:00
parent 5fb63604cf
commit 85b95ef153
10 changed files with 121 additions and 38 deletions

View File

@ -203,7 +203,7 @@ namespace SqlSugar
{
using (dataReader)
{
if (type.Name.StartsWith("KeyValuePair"))
if (UtilMethods.IsKeyValuePairType(type))
{
return GetKeyValueList<T>(type, dataReader);
}
@ -231,7 +231,7 @@ namespace SqlSugar
{
using (dataReader)
{
if (type.Name.StartsWith("KeyValuePair"))
if (UtilMethods.IsKeyValuePairType(type))
{
return await GetKeyValueListAsync<T>(type, dataReader);
}
@ -256,7 +256,7 @@ namespace SqlSugar
}
public virtual List<T> DataReaderToListNoUsing<T>(Type type, IDataReader dataReader)
{
if (type.Name.StartsWith("KeyValuePair"))
if (UtilMethods.IsKeyValuePairType(type))
{
return GetKeyValueList<T>(type, dataReader);
}
@ -275,7 +275,7 @@ namespace SqlSugar
}
public virtual Task<List<T>> DataReaderToListNoUsingAsync<T>(Type type, IDataReader dataReader)
{
if (type.Name.StartsWith("KeyValuePair"))
if (UtilMethods.IsKeyValuePairType(type))
{
return GetKeyValueListAsync<T>(type, dataReader);
}

View File

@ -214,6 +214,15 @@ namespace SqlSugar
generator.Emit(OpCodes.Ldloc, result);
generator.Emit(OpCodes.Ldarg_0);
generator.Emit(OpCodes.Ldc_I4, i);
var insertBuilder = InstanceFactory.GetInsertBuilder(this.Context?.CurrentConnectionConfig);
if (insertBuilder?.DeserializeObjectFunc != null)
{
if (IDataRecordExtensions.DeserializeObjectFunc == null)
{
IDataRecordExtensions.DeserializeObjectFunc = insertBuilder.DeserializeObjectFunc;
}
jsonMethod =typeof(IDataRecordExtensions).GetMethod("GetDeserializeObject").MakeGenericMethod(columnInfo.PropertyInfo.PropertyType);
}
generator.Emit(OpCodes.Call, jsonMethod);
generator.Emit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true));
generator.MarkLabel(endIfLabel);
@ -511,5 +520,5 @@ namespace SqlSugar
}
}
#endregion
}
}
}

View File

@ -10,7 +10,17 @@ namespace SqlSugar
public static partial class IDataRecordExtensions
{
#region Common Extensions
#region Common Extensions
public static Func<object, Type, object> DeserializeObjectFunc { get; internal set; }
public static T GetDeserializeObject<T>(this IDataReader dr, int i)
{
var obj = dr.GetValue(i);
if (obj == null)
return default(T);
var value = obj;
return (T)DeserializeObjectFunc(value, typeof(T));
}
public static XElement GetXelement(this IDataRecord dr, int i)
{
var result = XElement.Parse(dr.GetString(i).ToString());

View File

@ -347,8 +347,14 @@ namespace SqlSugar
}
if (column.IsJson && columnInfo.Value != null)
{
if (columnInfo.Value != null)
if (this.InsertBuilder.SerializeObjectFunc != null&& columnInfo.Value != null)
{
columnInfo.Value = this.InsertBuilder.SerializeObjectFunc(columnInfo.Value);
}
else if (columnInfo.Value != null)
{
columnInfo.Value = this.Context.Utilities.SerializeObject(columnInfo.Value);
}
}
//var tranColumn=EntityInfo.Columns.FirstOrDefault(it => it.IsTranscoding && it.DbColumnName.Equals(column.DbColumnName, StringComparison.CurrentCultureIgnoreCase));
if (column.IsTranscoding && columnInfo.Value.HasValue())

View File

@ -378,6 +378,10 @@ namespace SqlSugar
var data = listItemEntity.Columns.FirstOrDefault(it => it.PropertyName == navObjectNameColumnInfo.Navigat.Name);
ids = list.Select(it =>
{
if (data.ForOwnsOnePropertyInfo == null)
{
return it.GetType().GetProperty(navObjectNameColumnInfo.Navigat.Name).GetValue(it);
}
var ownsObj = data.ForOwnsOnePropertyInfo.GetValue(it);
return ownsObj.GetType().GetProperty(navObjectNameColumnInfo.Navigat.Name).GetValue(ownsObj);
}).Select(it => it == null ? "null" : it).Distinct().ToList();
@ -437,35 +441,64 @@ namespace SqlSugar
{
// 有 OwnsOne 的情况
var data = listItemEntity.Columns.FirstOrDefault(it => it.PropertyName == navObjectNameColumnInfo.Navigat.Name);
var groupQuery = (from l in list
let ownsObj = data.ForOwnsOnePropertyInfo.GetValue(l)
join n in navList
on ownsObj.GetType()
.GetProperty(navObjectNameColumnInfo.Navigat.Name)
.GetValue(ownsObj)
.ObjToString()
equals navPkColumn.PropertyInfo.GetValue(n).ObjToString()
select new
{
l,
n
}).ToList();
foreach (var item in groupQuery)
if (data.ForOwnsOnePropertyInfo == null)
{
// var setValue = navList.FirstOrDefault(x => navPkColumn.PropertyInfo.GetValue(x).ObjToString() == navColumn.PropertyInfo.GetValue(item).ObjToString());
if (navObjectNamePropety.GetValue(item.l) == null)
var groupQuery = (from l in list
join n in navList
on navColumn.PropertyInfo.GetValue(l).ObjToString()
equals navPkColumn.PropertyInfo.GetValue(n).ObjToString()
select new
{
l,
n
}).ToList();
foreach (var item in groupQuery)
{
navObjectNamePropety.SetValue(item.l, item.n);
}
else
{
//The reserved
}
// var setValue = navList.FirstOrDefault(x => navPkColumn.PropertyInfo.GetValue(x).ObjToString() == navColumn.PropertyInfo.GetValue(item).ObjToString());
if (navObjectNamePropety.GetValue(item.l) == null)
{
navObjectNamePropety.SetValue(item.l, item.n);
}
else
{
//The reserved
}
}
}
else
{
var groupQuery = (from l in list
let ownsObj = data.ForOwnsOnePropertyInfo.GetValue(l)
join n in navList
on ownsObj.GetType()
.GetProperty(navObjectNameColumnInfo.Navigat.Name)
.GetValue(ownsObj)
.ObjToString()
equals navPkColumn.PropertyInfo.GetValue(n).ObjToString()
select new
{
l,
n
}).ToList();
foreach (var item in groupQuery)
{
// var setValue = navList.FirstOrDefault(x => navPkColumn.PropertyInfo.GetValue(x).ObjToString() == navColumn.PropertyInfo.GetValue(item).ObjToString());
if (navObjectNamePropety.GetValue(item.l) == null)
{
navObjectNamePropety.SetValue(item.l, item.n);
}
else
{
//The reserved
}
}
}
}
}

View File

@ -282,6 +282,13 @@ namespace SqlSugar
count = parameters.Last().ObjToInt();
return reslt;
}
public DataTable ToDataTablePage(int pageNumber, int pageSize)
{
var method = QueryableObj.GetType().GetMyMethod("ToDataTablePage",2, typeof(int), typeof(int));
var parameters = new object[] { pageNumber, pageSize };
var reslt = (DataTable)method.Invoke(QueryableObj, parameters);
return reslt;
}
public DataTable ToDataTable()
{
var method = QueryableObj.GetType().GetMyMethod("ToDataTable", 0);
@ -381,6 +388,13 @@ namespace SqlSugar
count = parameters.Last().ObjToInt();
return await GetTask(task).ConfigureAwait(false);
}
public async Task<object> ToDataTablePageAsync(int pageNumber, int pageSize)
{
var method = QueryableObj.GetType().GetMyMethod("ToDataTablePageAsync", 2, typeof(int), typeof(int));
var parameters = new object[] { pageNumber, pageSize };
var task = (Task)method.Invoke(QueryableObj, parameters);
return await GetTask(task).ConfigureAwait(false);
}
public async Task<object> ToDataTableAsync()
{
var method = QueryableObj.GetType().GetMyMethod("ToDataTableAsync", 0);

View File

@ -660,17 +660,17 @@ namespace SqlSugar
/// </summary>
/// <param name="whereClass"></param>
/// <returns></returns>
public ISugarQueryable<T> WhereClass<ClassType>(ClassType whereClass, bool ignoreDefaultValue = false) where ClassType : class, new()
public virtual ISugarQueryable<T> WhereClass<ClassType>(ClassType whereClass, bool ignoreDefaultValue = false) where ClassType : class, new()
{
return WhereClass(new List<ClassType>() { whereClass }, ignoreDefaultValue);
}
public ISugarQueryable<T> WhereClassByPrimaryKey(List<T> list)
public virtual ISugarQueryable<T> WhereClassByPrimaryKey(List<T> list)
{
_WhereClassByPrimaryKey(list);
return this;
}
public ISugarQueryable<T> WhereClassByWhereColumns(List<T> list, string[] whereColumns)
public virtual ISugarQueryable<T> WhereClassByWhereColumns(List<T> list, string[] whereColumns)
{
_WhereClassByWhereColumns(list,whereColumns);
return this;

View File

@ -88,6 +88,8 @@ namespace SqlSugar
#region Methods
public virtual Func<object, string> SerializeObjectFunc { get; set; }
public virtual Func<object, Type, object> DeserializeObjectFunc { get; set; }
public virtual void ActionMinDate()
{
if (this.Parameters != null)
@ -393,7 +395,7 @@ namespace SqlSugar
}
return (Type)columnInfo.SqlParameterDbType == UtilConstants.SqlConvertType;
}
#endregion
}
}

View File

@ -413,7 +413,12 @@ namespace SqlSugar
if (column.IsJson)
{
columnInfo.IsJson = true;
if (columnInfo.Value != null)
var insertBuilder = InstanceFactory.GetInsertBuilder(this.Context?.CurrentConnectionConfig);
if (insertBuilder?.SerializeObjectFunc != null&& columnInfo.Value != null)
{
columnInfo.Value = insertBuilder?.SerializeObjectFunc(columnInfo.Value);
}
else if (columnInfo.Value != null)
columnInfo.Value = this.Context.Utilities.SerializeObject(columnInfo.Value);
}
if (column.IsArray)

View File

@ -18,6 +18,10 @@ namespace SqlSugar
{
public class UtilMethods
{
public static bool IsKeyValuePairType(Type type)
{
return type.IsGenericType && type.GetGenericTypeDefinition() == typeof(KeyValuePair<,>);
}
public static DataTable ConvertDateTimeOffsetToDateTime(DataTable table)
{
if (!table.Columns.Cast<DataColumn>().Any(it => it.DataType == typeof(DateTimeOffset)))