diff --git a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs index feffd8cf7..d2873e98e 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/QueryableProvider/QueryableProvider.cs @@ -2581,6 +2581,7 @@ namespace SqlSugar result.SqlBuilder = this.SqlBuilder; result.SqlBuilder.QueryBuilder.Parameters = QueryBuilder.Parameters; result.SqlBuilder.QueryBuilder.SelectValue = expression; + result.SqlBuilder.QueryBuilder.IsSelectSingleFiledJson = UtilMethods.IsJsonMember(expression,this.Context); if (this.IsCache) { result.WithCache(this.CacheTime); @@ -3370,6 +3371,10 @@ namespace SqlSugar { result = this.Context.Utilities.DataReaderToExpandoObjectList(dataReader).Select(it => ((TResult)(object)it)).ToList(); } + else if (QueryBuilder.IsSelectSingleFiledJson) + { + result= this.Context.Utilities.DataReaderToSelectJsonList(dataReader); + } else if (entityType.IsAnonymousType() || isComplexModel) { result = this.Context.Utilities.DataReaderToList(dataReader); @@ -3393,6 +3398,10 @@ namespace SqlSugar var expObj = await this.Context.Utilities.DataReaderToExpandoObjectListAsync(dataReader); result = expObj.Select(it => ((TResult)(object)it)).ToList(); } + else if (QueryBuilder.IsSelectSingleFiledJson) + { + result= await this.Context.Utilities.DataReaderToSelectJsonListAsync(dataReader); + } else if (entityType.IsAnonymousType() || isComplexModel) { result =await this.Context.Utilities.DataReaderToListAsync(dataReader); diff --git a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs index 27de1d9db..98832a2f2 100644 --- a/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs +++ b/Src/Asp.Net/SqlSugar/Abstract/SqlBuilderProvider/QueryBuilder.cs @@ -33,6 +33,7 @@ namespace SqlSugar #endregion #region Splicing basic + public bool IsSelectSingleFiledJson { get; set; } public string TranLock { get; set; } public bool IsDisableMasterSlaveSeparation { get; set; } public bool IsEnableMasterSlaveSeparation { get; set; } diff --git a/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs b/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs index 6497ee24a..4739e8595 100644 --- a/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs +++ b/Src/Asp.Net/SqlSugar/Infrastructure/ContextMethods.cs @@ -202,6 +202,30 @@ namespace SqlSugar return reval; } } + + + public List DataReaderToSelectJsonList(IDataReader dataReader) + { + List result = new List(); + using (dataReader) + { + while (dataReader.Read()) + { + var value = dataReader.GetValue(0); + if (value == null || value == DBNull.Value) + { + result.Add(default(T)); + } + else + { + result.Add(Context.Utilities.DeserializeObject(value.ToString())); + } + } + } + + return result; + } + /// /// DataReaderToList /// @@ -249,6 +273,29 @@ namespace SqlSugar return reval; } } + + + public async Task> DataReaderToSelectJsonListAsync(IDataReader dataReader) + { + List result = new List(); + using (dataReader) + { + while (await ((DbDataReader)dataReader).ReadAsync()) + { + var value = dataReader.GetValue(0); + if (value == null || value == DBNull.Value) + { + result.Add(default(T)); + } + else + { + result.Add(Context.Utilities.DeserializeObject(value.ToString())); + } + } + } + return result; + } + /// /// DataReaderToList /// diff --git a/Src/Asp.Net/SqlSugar/Interface/IContextMethods.cs b/Src/Asp.Net/SqlSugar/Interface/IContextMethods.cs index 95f71262a..fe80e4cb3 100644 --- a/Src/Asp.Net/SqlSugar/Interface/IContextMethods.cs +++ b/Src/Asp.Net/SqlSugar/Interface/IContextMethods.cs @@ -17,6 +17,8 @@ namespace SqlSugar List DataReaderToExpandoObjectListNoUsing(IDataReader reader); Task> DataReaderToExpandoObjectListAsyncNoUsing(IDataReader dataReader); List DataReaderToList(IDataReader reader); + List DataReaderToSelectJsonList(IDataReader reader); + Task> DataReaderToSelectJsonListAsync(IDataReader reader); List DataReaderToListNoUsing(IDataReader reader); Task> DataReaderToListAsync(IDataReader dataReader); Task> DataReaderToListAsyncNoUsing(IDataReader dataReader); diff --git a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs index 961ef3c49..4b42f92c0 100644 --- a/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs +++ b/Src/Asp.Net/SqlSugar/Utilities/UtilMethods.cs @@ -17,6 +17,24 @@ namespace SqlSugar { public class UtilMethods { + internal static bool IsJsonMember(Expression expression, SqlSugarProvider context) + { + if (expression == null) + return false; + if (!(expression is LambdaExpression)) + return false; + var lambda = (LambdaExpression)expression; + if (!(lambda.Body is MemberExpression)) + return false; + var member = lambda.Body as MemberExpression; + if (!(member.Type.IsClass())) + return false; + if (member.Expression == null) + return false; + var entity = context.EntityMaintenance.GetEntityInfo(member.Expression.Type); + var json = entity.Columns.FirstOrDefault(z => z.IsJson && z.PropertyName == member.Member.Name); + return json != null; + } public static string GetSeparatorChar() { return Path.Combine("a", "a").Replace("a", "");