diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs index a97d5c0ca..a855a2204 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/DbBindProvider.cs @@ -203,7 +203,7 @@ namespace SqlSugar { using (dataReader) { - if (type.Name.StartsWith("KeyValuePair")) + if (UtilMethods.IsKeyValuePairType(type)) { return GetKeyValueList(type, dataReader); } @@ -231,7 +231,7 @@ namespace SqlSugar { using (dataReader) { - if (type.Name.StartsWith("KeyValuePair")) + if (UtilMethods.IsKeyValuePairType(type)) { return await GetKeyValueListAsync(type, dataReader); } @@ -256,7 +256,7 @@ namespace SqlSugar } public virtual List DataReaderToListNoUsing(Type type, IDataReader dataReader) { - if (type.Name.StartsWith("KeyValuePair")) + if (UtilMethods.IsKeyValuePairType(type)) { return GetKeyValueList(type, dataReader); } @@ -275,7 +275,7 @@ namespace SqlSugar } public virtual Task> DataReaderToListNoUsingAsync(Type type, IDataReader dataReader) { - if (type.Name.StartsWith("KeyValuePair")) + if (UtilMethods.IsKeyValuePairType(type)) { return GetKeyValueListAsync(type, dataReader); } diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs index e8e4ce374..93cd472fa 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs @@ -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 - } + } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs index 32d9973c0..871e0b214 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs @@ -10,7 +10,17 @@ namespace SqlSugar public static partial class IDataRecordExtensions { - #region Common Extensions + #region Common Extensions + public static Func DeserializeObjectFunc { get; internal set; } + + public static T GetDeserializeObject(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()); diff --git a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableHelper.cs index a3ab983fc..dd76fe0e6 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/InsertableProvider/InsertableHelper.cs @@ -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()) diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs index 367c6a7d5..a02dade9a 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/NavigatManager.cs @@ -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 + } + + } } } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs index ec0b0294f..230c8b088 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryMethodInfo.cs @@ -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 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 ToDataTableAsync() { var method = QueryableObj.GetType().GetMyMethod("ToDataTableAsync", 0); diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index 887883a7e..59875a415 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -660,17 +660,17 @@ namespace SqlSugar /// /// /// - public ISugarQueryable WhereClass(ClassType whereClass, bool ignoreDefaultValue = false) where ClassType : class, new() + public virtual ISugarQueryable WhereClass(ClassType whereClass, bool ignoreDefaultValue = false) where ClassType : class, new() { return WhereClass(new List() { whereClass }, ignoreDefaultValue); } - public ISugarQueryable WhereClassByPrimaryKey(List list) + public virtual ISugarQueryable WhereClassByPrimaryKey(List list) { _WhereClassByPrimaryKey(list); return this; } - public ISugarQueryable WhereClassByWhereColumns(List list, string[] whereColumns) + public virtual ISugarQueryable WhereClassByWhereColumns(List list, string[] whereColumns) { _WhereClassByWhereColumns(list,whereColumns); return this; diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs index 560be8780..10628faf3 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/InsertBuilder.cs @@ -88,6 +88,8 @@ namespace SqlSugar #region Methods + public virtual Func SerializeObjectFunc { get; set; } + public virtual Func DeserializeObjectFunc { get; set; } public virtual void ActionMinDate() { if (this.Parameters != null) @@ -393,7 +395,7 @@ namespace SqlSugar } return (Type)columnInfo.SqlParameterDbType == UtilConstants.SqlConvertType; } - + #endregion } } diff --git a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs index 02695abe5..dd7966e2a 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/UpdateProvider/UpdateableHelper.cs @@ -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) diff --git a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs index c5d214d04..9e0b9e952 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs @@ -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().Any(it => it.DataType == typeof(DateTimeOffset)))