This commit is contained in:
sunkaixuan 2017-05-24 20:35:23 +08:00
parent efe4233125
commit cee667117a
17 changed files with 115 additions and 15 deletions

View File

@ -37,7 +37,7 @@ namespace OrmTest.UnitTest
{ {
foreach (var item in pars) foreach (var item in pars)
{ {
if (!validPars.Any(it => it.ParameterName.Equals(item.ParameterName) && it.Value.Equals(item.Value))) if (!validPars.Any(it => it.ParameterName.Equals(item.ParameterName) && it.Value.ObjToString().Equals(item.Value.ObjToString())))
{ {
throw new Exception(errorMessage); throw new Exception(errorMessage);
} }

View File

@ -98,8 +98,7 @@ UNION ALL
new SugarParameter("@Id",1), new SugarParameter("@Id",1),
new SugarParameter("@TestId",0), new SugarParameter("@TestId",0),
new SugarParameter("@CreateTime", Convert.ToDateTime("2017-05-21 09:56:12.610")), new SugarParameter("@CreateTime", Convert.ToDateTime("2017-05-21 09:56:12.610")),
new SugarParameter("@Const0", 1), new SugarParameter("@Const0", 1)
new SugarParameter("@Name", "jack")
}, t8.Key, t8.Value, "Update t8 error" }, t8.Key, t8.Value, "Update t8 error"
); );
@ -116,7 +115,18 @@ UNION ALL
new SugarParameter("@CreateTime", Convert.ToDateTime("2017-05-21 09:56:12.610")), new SugarParameter("@CreateTime", Convert.ToDateTime("2017-05-21 09:56:12.610")),
new SugarParameter("@Name", "jack") },t9.Key,t9.Value,"Upate t9 error" new SugarParameter("@Name", "jack") },t9.Key,t9.Value,"Upate t9 error"
); );
updateObj.SchoolId = 18;
string name = "x";
var t10 = db.Updateable<Student>().UpdateColumns(it => new Student() { Name =name, SchoolId=updateObj.SchoolId }).Where(it=>it.Id==11).ToSql();
base.Check(@"UPDATE [Student] SET
[SchoolId] = [@Const0] , [Name] = [@constant1] WHERE ( [Id] = @Id1 )", new List<SugarParameter>() {
new SugarParameter("@constant1","x"),
new SugarParameter("@Const0",18),
new SugarParameter("@Id1",11)},
t10.Key,
t10.Value,
"Update 10 error"
);
} }
public SqlSugarClient GetInstance() public SqlSugarClient GetInstance()

View File

@ -18,7 +18,8 @@ namespace SqlSugar
public abstract string GetTranslationTableName(string name); public abstract string GetTranslationTableName(string name);
public abstract string GetTranslationColumnName(string entityName, string propertyName); public abstract string GetTranslationColumnName(string entityName, string propertyName);
public abstract string GetTranslationColumnName(string propertyName); public abstract string GetTranslationColumnName(string propertyName);
public abstract string GetNoTranslationColumnName(string name);
public string AppendWhereOrAnd(bool isWhere, string sqlString) public string AppendWhereOrAnd(bool isWhere, string sqlString)
{ {
return isWhere ? (" WHERE " + sqlString ):( " AND " + sqlString); return isWhere ? (" WHERE " + sqlString ):( " AND " + sqlString);

View File

@ -25,7 +25,7 @@ namespace SqlSugar
public int ExecuteCommand() public int ExecuteCommand()
{ {
PreToSql(); PreToSql();
return this.Ado.ExecuteCommand(UpdateBuilder.ToSqlString(), UpdateBuilder.Parameters==null?null:UpdateBuilder.Parameters.ToArray()); return this.Ado.ExecuteCommand(UpdateBuilder.ToSqlString(), UpdateBuilder.Parameters == null ? null : UpdateBuilder.Parameters.ToArray());
} }
public IUpdateable<T> IgnoreColumns(Func<string, bool> ignoreColumMethod) public IUpdateable<T> IgnoreColumns(Func<string, bool> ignoreColumMethod)
@ -44,7 +44,7 @@ namespace SqlSugar
public IUpdateable<T> ReSetValue(Expression<Func<T, bool>> setValueExpression) public IUpdateable<T> ReSetValue(Expression<Func<T, bool>> setValueExpression)
{ {
var expResult = UpdateBuilder.GetExpressionValue(setValueExpression, ResolveExpressType.WhereSingle); var expResult = UpdateBuilder.GetExpressionValue(setValueExpression, ResolveExpressType.WhereSingle);
var resultString =Regex.Match(expResult.GetResultString(),@"\((.+)\)").Groups[1].Value; var resultString = Regex.Match(expResult.GetResultString(), @"\((.+)\)").Groups[1].Value;
LambdaExpression lambda = setValueExpression as LambdaExpression; LambdaExpression lambda = setValueExpression as LambdaExpression;
var expression = lambda.Body; var expression = lambda.Body;
Check.Exception(!(expression is BinaryExpression), "Expression format error"); Check.Exception(!(expression is BinaryExpression), "Expression format error");
@ -74,11 +74,25 @@ namespace SqlSugar
item.IsPrimarykey = true; item.IsPrimarykey = true;
} }
} }
this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => ignoreColumns.Contains(it.PropertyName)||it.IsPrimarykey==true).ToList(); this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => ignoreColumns.Contains(it.PropertyName) || it.IsPrimarykey == true).ToList();
return this;
}
public IUpdateable<T> UpdateColumns(Expression<Func<T, T>> columns)
{
var expResult = UpdateBuilder.GetExpressionValue(columns, ResolveExpressType.Update);
var resultArray=expResult.GetResultArray();
if (resultArray.IsValuable()) {
foreach (var item in resultArray)
{
string key = SqlBuilder.GetNoTranslationColumnName(item);
UpdateBuilder.SetValues.Add(new KeyValuePair<string, string>(SqlBuilder.GetTranslationColumnName(key), item));
}
}
this.UpdateBuilder.DbColumnInfoList = this.UpdateBuilder.DbColumnInfoList.Where(it => UpdateBuilder.SetValues.Any(v=> SqlBuilder.GetNoTranslationColumnName(v.Key) ==it.DbColumnName) || it.IsPrimarykey == true).ToList();
return this; return this;
} }
public IUpdateable<T> Where(bool isUpdateNull,bool IsOffIdentity=false) public IUpdateable<T> Where(bool isUpdateNull, bool IsOffIdentity = false)
{ {
UpdateBuilder.IsOffIdentity = IsOffIdentity; UpdateBuilder.IsOffIdentity = IsOffIdentity;
return this; return this;
@ -115,7 +129,7 @@ namespace SqlSugar
{ {
var columnInfo = new DbColumnInfo() var columnInfo = new DbColumnInfo()
{ {
Value = column.PropertyInfo.GetValue(item,null), Value = column.PropertyInfo.GetValue(item, null),
DbColumnName = GetDbColumnName(column.PropertyName), DbColumnName = GetDbColumnName(column.PropertyName),
PropertyName = column.PropertyName, PropertyName = column.PropertyName,
TableId = i TableId = i
@ -174,7 +188,9 @@ namespace SqlSugar
} }
}); });
} }
if (this.UpdateBuilder.Parameters.IsValuable()&&this.UpdateBuilder.SetValues.IsValuable()) {
this.UpdateBuilder.Parameters.RemoveAll(it => this.UpdateBuilder.SetValues.Any(v =>(SqlBuilder.SqlParameterKeyWord+SqlBuilder.GetNoTranslationColumnName(v.Key)) == it.ParameterName));
}
} }
private string GetDbColumnName(string entityName) private string GetDbColumnName(string entityName)
{ {

View File

@ -103,6 +103,7 @@ namespace SqlSugar
case ResolveExpressType.Array: case ResolveExpressType.Array:
case ResolveExpressType.SelectSingle: case ResolveExpressType.SelectSingle:
case ResolveExpressType.SelectMultiple: case ResolveExpressType.SelectMultiple:
case ResolveExpressType.Update:
parameter = parameter + ","; parameter = parameter + ",";
break; break;
case ResolveExpressType.WhereSingle: case ResolveExpressType.WhereSingle:

View File

@ -14,7 +14,8 @@ namespace SqlSugar
FieldSingle=5, FieldSingle=5,
FieldMultiple=7, FieldMultiple=7,
Join=8, Join=8,
Array=9 Array=9,
Update=10
} }
} }

View File

@ -149,6 +149,12 @@ namespace SqlSugar
{ {
return string.Format(" {0} {1} {2} ", GetTranslationTableName(fieldValue), "AS", GetTranslationColumnName(asName)); return string.Format(" {0} {1} {2} ", GetTranslationTableName(fieldValue), "AS", GetTranslationColumnName(asName));
} }
public virtual string GetEqString(string asName, string fieldValue)
{
return string.Format(" {2} {1} {0} ", GetTranslationTableName(fieldValue), "=", GetTranslationColumnName(asName));
}
public virtual string GetAsString(string asName, string fieldValue, string fieldShortName) public virtual string GetAsString(string asName, string fieldValue, string fieldShortName)
{ {
return string.Format(" {0} {1} {2} ", GetTranslationTableName(fieldShortName + "." + fieldValue), "AS", GetTranslationColumnName(asName)); return string.Format(" {0} {1} {2} ", GetTranslationTableName(fieldShortName + "." + fieldValue), "AS", GetTranslationColumnName(asName));

View File

@ -19,6 +19,7 @@ namespace SqlSugar
switch (parameter.Context.ResolveType) switch (parameter.Context.ResolveType)
{ {
case ResolveExpressType.SelectSingle: case ResolveExpressType.SelectSingle:
case ResolveExpressType.Update:
case ResolveExpressType.SelectMultiple: case ResolveExpressType.SelectMultiple:
baseParameter.CommonTempData = value; baseParameter.CommonTempData = value;
break; break;

View File

@ -18,6 +18,7 @@ namespace SqlSugar
var isSetTempData = baseParameter.CommonTempData.IsValuable() && baseParameter.CommonTempData.Equals(CommonTempDataType.ChildNodeSet); var isSetTempData = baseParameter.CommonTempData.IsValuable() && baseParameter.CommonTempData.Equals(CommonTempDataType.ChildNodeSet);
switch (parameter.Context.ResolveType) switch (parameter.Context.ResolveType)
{ {
case ResolveExpressType.Update:
case ResolveExpressType.SelectSingle: case ResolveExpressType.SelectSingle:
case ResolveExpressType.SelectMultiple: case ResolveExpressType.SelectMultiple:
parameter.BaseParameter.CommonTempData = value; parameter.BaseParameter.CommonTempData = value;

View File

@ -28,11 +28,62 @@ namespace SqlSugar
break; break;
case ResolveExpressType.FieldMultiple: case ResolveExpressType.FieldMultiple:
break; break;
case ResolveExpressType.Update:
Update(expression, parameter);
break;
default: default:
break; break;
} }
} }
private void Update(MemberInitExpression expression, ExpressionParameter parameter)
{
int i = 0;
foreach (MemberBinding binding in expression.Bindings)
{
++i;
if (binding.BindingType != MemberBindingType.Assignment)
{
throw new NotSupportedException();
}
MemberAssignment memberAssignment = (MemberAssignment)binding;
var memberName = memberAssignment.Member.Name;
var item = memberAssignment.Expression;
if (item.NodeType == ExpressionType.Constant || (item is MemberExpression) && ((MemberExpression)item).Expression.NodeType == ExpressionType.Constant)
{
base.Expression = item;
base.Start();
string parameterName = this.Context.SqlParameterKeyWord + "constant" + i;
parameter.Context.Result.Append(base.Context.GetEqString(memberName, parameterName));
this.Context.Parameters.Add(new SugarParameter(parameterName, parameter.CommonTempData));
}
else if (item is MethodCallExpression)
{
base.Expression = item;
base.Start();
parameter.Context.Result.Append(base.Context.GetEqString(memberName, parameter.CommonTempData.ObjToString()));
}
else if (item is MemberExpression || item is UnaryExpression)
{
if (base.Context.Result.IsLockCurrentParameter == false)
{
base.Context.Result.CurrentParameter = parameter;
base.Context.Result.IsLockCurrentParameter = true;
parameter.IsAppendTempDate();
base.Expression = item;
base.Start();
parameter.IsAppendResult();
base.Context.Result.Append(base.Context.GetEqString(memberName, parameter.CommonTempData.ObjToString()));
base.Context.Result.CurrentParameter = null;
}
}
else if (item is BinaryExpression)
{
Check.ThrowNotSupportedException(item.GetType().Name);
}
}
}
public void Select(MemberInitExpression expression, ExpressionParameter parameter, bool isSingle) public void Select(MemberInitExpression expression, ExpressionParameter parameter, bool isSingle)
{ {
int i = 0; int i = 0;

View File

@ -26,6 +26,7 @@ namespace SqlSugar
break; break;
case ResolveExpressType.SelectSingle: case ResolveExpressType.SelectSingle:
case ResolveExpressType.SelectMultiple: case ResolveExpressType.SelectMultiple:
case ResolveExpressType.Update:
SelectMethod(parameter, isLeft, name, args, model); SelectMethod(parameter, isLeft, name, args, model);
break; break;
case ResolveExpressType.FieldSingle: case ResolveExpressType.FieldSingle:

View File

@ -15,6 +15,7 @@ namespace SqlSugar
{ {
case ResolveExpressType.SelectSingle: case ResolveExpressType.SelectSingle:
case ResolveExpressType.SelectMultiple: case ResolveExpressType.SelectMultiple:
case ResolveExpressType.Update:
base.Expression = expression.Right; base.Expression = expression.Right;
base.Start(); base.Start();

View File

@ -20,6 +20,7 @@ namespace SqlSugar
break; break;
case ResolveExpressType.SelectSingle: case ResolveExpressType.SelectSingle:
case ResolveExpressType.SelectMultiple: case ResolveExpressType.SelectMultiple:
case ResolveExpressType.Update:
parameter.BaseParameter.CommonTempData = expression.Name; parameter.BaseParameter.CommonTempData = expression.Name;
break; break;
case ResolveExpressType.FieldSingle: case ResolveExpressType.FieldSingle:

View File

@ -19,6 +19,7 @@ namespace SqlSugar
case ResolveExpressType.FieldMultiple: case ResolveExpressType.FieldMultiple:
case ResolveExpressType.SelectSingle: case ResolveExpressType.SelectSingle:
case ResolveExpressType.SelectMultiple: case ResolveExpressType.SelectMultiple:
case ResolveExpressType.Update:
base.Expression = expression.Operand; base.Expression = expression.Operand;
if (base.Expression is BinaryExpression||parameter.BaseExpression is BinaryExpression) if (base.Expression is BinaryExpression||parameter.BaseExpression is BinaryExpression)
{ {

View File

@ -23,5 +23,6 @@ namespace SqlSugar
string GetTranslationTableName(string name); string GetTranslationTableName(string name);
string GetTranslationColumnName(string entityName, string propertyName); string GetTranslationColumnName(string entityName, string propertyName);
string GetTranslationColumnName(string propertyName); string GetTranslationColumnName(string propertyName);
string GetNoTranslationColumnName(string name);
} }
} }

View File

@ -14,6 +14,7 @@ namespace SqlSugar
IUpdateable<T> Where(bool isUpdateNull,bool IsOffIdentity = false); IUpdateable<T> Where(bool isUpdateNull,bool IsOffIdentity = false);
IUpdateable<T> Where(Expression<Func<T, bool>> expression); IUpdateable<T> Where(Expression<Func<T, bool>> expression);
IUpdateable<T> UpdateColumns(Expression<Func<T, object>> columns); IUpdateable<T> UpdateColumns(Expression<Func<T, object>> columns);
IUpdateable<T> UpdateColumns(Expression<Func<T, T>> columns);
IUpdateable<T> IgnoreColumns(Expression<Func<T, object>> columns); IUpdateable<T> IgnoreColumns(Expression<Func<T, object>> columns);
IUpdateable<T> IgnoreColumns(Func<string, bool> ignoreColumMethod); IUpdateable<T> IgnoreColumns(Func<string, bool> ignoreColumMethod);
IUpdateable<T> ReSetValue(Expression<Func<T, bool>> setValueExpression); IUpdateable<T> ReSetValue(Expression<Func<T, bool>> setValueExpression);

View File

@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace SqlSugar namespace SqlSugar
@ -24,15 +25,20 @@ namespace SqlSugar
var context = this.Context; var context = this.Context;
var mappingInfo = context var mappingInfo = context
.MappingColumns .MappingColumns
.FirstOrDefault(it => .FirstOrDefault(it =>
it.EntityName.Equals(entityName, StringComparison.CurrentCultureIgnoreCase)&& it.EntityName.Equals(entityName, StringComparison.CurrentCultureIgnoreCase) &&
it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase)); it.PropertyName.Equals(propertyName, StringComparison.CurrentCultureIgnoreCase));
return (mappingInfo == null ? "["+ propertyName + "]" : "["+mappingInfo.DbColumnName+"]"); return (mappingInfo == null ? "[" + propertyName + "]" : "[" + mappingInfo.DbColumnName + "]");
} }
public override string GetTranslationColumnName(string propertyName) public override string GetTranslationColumnName(string propertyName)
{ {
return "[" + propertyName + "]"; return "[" + propertyName + "]";
} }
public override string GetNoTranslationColumnName(string name)
{
return name == null ? string.Empty : Regex.Match(name, @"\[(.*?)\]").Groups[1].Value;
}
} }
} }