diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs index 74e15db99..1d064442f 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataReaderEntityBuilder.cs @@ -6,6 +6,7 @@ using System.Data; using System.Reflection; using System.Reflection.Emit; using System.Text.RegularExpressions; +using System.Xml.Linq; namespace SqlSugar { @@ -41,6 +42,7 @@ namespace SqlSugar private static readonly MethodInfo getdatetimeoffset = typeof(IDataRecordExtensions).GetMethod("Getdatetimeoffset"); private static readonly MethodInfo getdatetimeoffsetDate = typeof(IDataRecordExtensions).GetMethod("GetdatetimeoffsetDate"); private static readonly MethodInfo getStringGuid = typeof(IDataRecordExtensions).GetMethod("GetStringGuid"); + private static readonly MethodInfo getXelement = typeof(IDataRecordExtensions).GetMethod("GetXelement"); private static readonly MethodInfo getConvertStringGuid = typeof(IDataRecordExtensions).GetMethod("GetConvertStringGuid"); private static readonly MethodInfo getEnum = typeof(IDataRecordExtensions).GetMethod("GetEnum"); private static readonly MethodInfo getConvertString = typeof(IDataRecordExtensions).GetMethod("GetConvertString"); @@ -182,6 +184,21 @@ namespace SqlSugar generator.Emit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true)); generator.MarkLabel(endIfLabel); } + else if (columnInfo.UnderType == typeof(XElement)) + { + int i = DataRecord.GetOrdinal(fieldName); + Label endIfLabel = generator.DefineLabel(); + generator.Emit(OpCodes.Ldarg_0); + generator.Emit(OpCodes.Ldc_I4, i); + generator.Emit(OpCodes.Callvirt, isDBNullMethod); + generator.Emit(OpCodes.Brtrue, endIfLabel); + generator.Emit(OpCodes.Ldloc, result); + generator.Emit(OpCodes.Ldarg_0); + generator.Emit(OpCodes.Ldc_I4, i); + BindMethod(generator, columnInfo, i); + generator.Emit(OpCodes.Callvirt, columnInfo.PropertyInfo.GetSetMethod(true)); + generator.MarkLabel(endIfLabel); + } } private void BindField(ILGenerator generator, LocalBuilder result, EntityColumnInfo columnInfo, string fieldName) { @@ -285,6 +302,10 @@ namespace SqlSugar { method = isNullableType ? getConvertStringGuid : getStringGuid; } + else if (bindProperyTypeName == "xelement") + { + method = getXelement; + } break; case CSharpDataType.DateTime: CheckType(bind.DateThrow, bindProperyTypeName, validPropertyName, propertyName); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs index 9e27fc12d..829790f45 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/DbBindProvider/IDataRecordExtensions.cs @@ -3,12 +3,19 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; +using System.Xml.Linq; + namespace SqlSugar { public static partial class IDataRecordExtensions { #region Common Extensions + public static XElement GetXelement(this IDataRecord dr, int i) + { + var result = XElement.Parse(dr.GetString(i).ToString()); + return result; + } public static Guid GetStringGuid(this IDataRecord dr, int i) { var result = Guid.Parse(dr.GetValue(i).ToString()); diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs index 40547d9aa..d9fc2fe3c 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/DeleteProvider/DeleteableProvider.cs @@ -306,7 +306,11 @@ namespace SqlSugar var queryable = this.Context.Queryable(); queryable.QueryBuilder.LambdaExpressions.ParameterIndex= 1000; var sqlable= queryable.ToSql(); - this.Where(Regex.Split(sqlable.Key," Where ",RegexOptions.IgnoreCase).Last(), sqlable.Value); + var whereInfos = Regex.Split(sqlable.Key, " Where ", RegexOptions.IgnoreCase); + if (whereInfos.Length > 1) + { + this.Where(whereInfos.Last(), sqlable.Value); + } return this; } public SplitTableDeleteProvider SplitTable(Func, IEnumerable> getTableNamesFunc) diff --git a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/SplitTableUpdateByObjectProvider.cs b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/SplitTableUpdateByObjectProvider.cs index 90ce43193..8b1b25c17 100644 --- a/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/SplitTableUpdateByObjectProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Abstract/UpdateProvider/SplitTableUpdateByObjectProvider.cs @@ -24,7 +24,9 @@ namespace SqlSugar foreach (var item in groupModels.GroupBy(it => it.GroupName)) { var addList = item.Select(it => it.Item).ToList(); - result += this.Context.Updateable(addList).IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommand(); + result += this.Context.Updateable(addList) + .IgnoreColumns(this.updateobj.UpdateBuilder.IsNoUpdateNull, this.updateobj.UpdateBuilder.IsOffIdentity,this.updateobj.UpdateBuilder.IsNoUpdateDefaultValue) + .IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommand(); } return result; } @@ -38,7 +40,9 @@ namespace SqlSugar foreach (var item in groupModels.GroupBy(it => it.GroupName)) { var addList = item.Select(it => it.Item).ToList(); - result += await this.Context.Updateable(addList).IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommandAsync(); + result += await this.Context.Updateable(addList) + .IgnoreColumns(this.updateobj.UpdateBuilder.IsNoUpdateNull, this.updateobj.UpdateBuilder.IsOffIdentity, this.updateobj.UpdateBuilder.IsNoUpdateDefaultValue) + .IgnoreColumns(GetIgnoreColumns()).AS(item.Key).ExecuteCommandAsync(); } return result; } diff --git a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs index b9a49d0ff..25911181c 100644 --- a/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs +++ b/Src/Asp.NetCore2/SqlSugar/ExpressionsToSql/ResolveItems/BaseResolve.cs @@ -515,6 +515,13 @@ namespace SqlSugar }); parameter.Context.Result.Append(this.Context.GetAsString(asName, sql)); } + else if (item.NodeType == ExpressionType.Not + && (item as UnaryExpression).Operand is MethodCallExpression + && ((item as UnaryExpression).Operand as MethodCallExpression).Method.Name.IsIn("IsNullOrEmpty", "IsNullOrWhiteSpace")) + { + var asValue = packIfElse(GetNewExpressionValue(item)).ObjToString(); + parameter.Context.Result.Append(this.Context.GetAsString(asName, asValue)); + } else if (item is MethodCallExpression || item is UnaryExpression || item is ConditionalExpression || item.NodeType == ExpressionType.Coalesce) { this.Expression = item; @@ -526,7 +533,15 @@ namespace SqlSugar Check.ThrowNotSupportedException(item.GetType().Name); } } - + public object packIfElse(object methodValue) + { + methodValue = this.Context.DbMehtods.CaseWhen(new List>() { + new KeyValuePair("IF",methodValue.ObjToString()), + new KeyValuePair("Return","1"), + new KeyValuePair("End","0") + }); + return methodValue; + } private static bool IsNotCaseExpression(Expression item) { if ((item as MethodCallExpression).Method.Name == "IIF") diff --git a/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlServerProvider.cs b/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlServerProvider.cs index d1b6b88b2..ffb2f16e5 100644 --- a/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlServerProvider.cs +++ b/Src/Asp.NetCore2/SqlSugar/Realization/SqlServer/SqlServerProvider.cs @@ -6,6 +6,8 @@ using Microsoft.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml.Linq; + namespace SqlSugar { public class SqlServerProvider : AdoProvider @@ -131,10 +133,15 @@ namespace SqlSugar sqlParameter.Value = parameter.Value; sqlParameter.DbType = parameter.DbType; var isTime = parameter.DbType == System.Data.DbType.Time; - if (isTime) + if (isTime) { - sqlParameter.SqlDbType = SqlDbType.Time; - sqlParameter.Value=DateTime.Parse(parameter.Value?.ToString()).TimeOfDay; + sqlParameter.SqlDbType = SqlDbType.Time; + sqlParameter.Value=DateTime.Parse(parameter.Value?.ToString()).TimeOfDay; + } + else if (parameter.Value!=null&¶meter.Value is XElement) + { + sqlParameter.SqlDbType = SqlDbType.Xml; + sqlParameter.Value= (parameter.Value as XElement).ToString(); } if (sqlParameter.Value!=null&& sqlParameter.Value != DBNull.Value && sqlParameter.DbType == System.Data.DbType.DateTime) {