diff --git a/FreeSql.Tests/UnitTest1.cs b/FreeSql.Tests/UnitTest1.cs index 6234d919..65f1f96b 100644 --- a/FreeSql.Tests/UnitTest1.cs +++ b/FreeSql.Tests/UnitTest1.cs @@ -269,6 +269,14 @@ namespace FreeSql.Tests { [Fact] public void Test1() { + var tbid = g.sqlite.Select().First().Id; + var tbidsql = g.sqlite.Update().Where(a => a.Id == tbid) + .Set(a => new TaskBuild { + FileName = "111", + TaskName = a.TaskName + "333" + }).ToSql(); + + var dkdkdkd = g.oracle.Select().ToList(); diff --git a/FreeSql/FreeSql.xml b/FreeSql/FreeSql.xml index e59d286f..2636dad9 100644 --- a/FreeSql/FreeSql.xml +++ b/FreeSql/FreeSql.xml @@ -1534,9 +1534,11 @@ 设置列的的新值为基础上增加,格式:Set(a => a.Clicks + 1) 相当于 clicks=clicks+1 + + 指定更新,格式:Set(a => new { Clicks = a.Clicks + 1, Time = DateTime.Now }) 相当于 set clicks=clicks+1,time='2019-06-19....' - + diff --git a/FreeSql/Interface/Curd/IUpdate.cs b/FreeSql/Interface/Curd/IUpdate.cs index b16c0e65..d1708055 100644 --- a/FreeSql/Interface/Curd/IUpdate.cs +++ b/FreeSql/Interface/Curd/IUpdate.cs @@ -74,11 +74,13 @@ namespace FreeSql { IUpdate Set(Expression> column, TMember value); /// /// 设置列的的新值为基础上增加,格式:Set(a => a.Clicks + 1) 相当于 clicks=clicks+1 + /// + /// 指定更新,格式:Set(a => new { Clicks = a.Clicks + 1, Time = DateTime.Now }) 相当于 set clicks=clicks+1,time='2019-06-19....' /// /// - /// + /// /// - IUpdate Set(Expression> binaryExpression); + IUpdate Set(Expression> exp); /// /// 设置值,自定义SQL语法,SetRaw("title = ?title", new { title = "newtitle" }) /// diff --git a/FreeSql/Internal/CommonProvider/UpdateProvider.cs b/FreeSql/Internal/CommonProvider/UpdateProvider.cs index c5d17d13..286f325a 100644 --- a/FreeSql/Internal/CommonProvider/UpdateProvider.cs +++ b/FreeSql/Internal/CommonProvider/UpdateProvider.cs @@ -6,6 +6,7 @@ using System.Data; using System.Data.Common; using System.Linq; using System.Linq.Expressions; +using System.Reflection; using System.Text; using System.Threading.Tasks; @@ -340,15 +341,33 @@ namespace FreeSql.Internal.CommonProvider { //foreach (var t in _source) Utils.FillPropertyValue(t, tryf.CsName, value); return this; } - public IUpdate Set(Expression> binaryExpression) { - if (binaryExpression?.Body.NodeType == ExpressionType.Equal) { - _set.Append(", ").Append(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, binaryExpression, null)); + public IUpdate Set(Expression> exp) { + var body = exp?.Body; + var nodeType = body?.NodeType; + if (nodeType == ExpressionType.Equal) { + _set.Append(", ").Append(_commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, exp, null)); return this; } - if (binaryExpression?.Body is BinaryExpression == false && - binaryExpression?.Body.NodeType != ExpressionType.Call) return this; + + if (nodeType == ExpressionType.MemberInit) { + var initExp = body as MemberInitExpression; + if (initExp.Bindings?.Count > 0) { + for (var a = 0; a < initExp.Bindings.Count; a++) { + var initAssignExp = (initExp.Bindings[a] as MemberAssignment); + if (initAssignExp == null) continue; + var memberName = initExp.Bindings[a].Member.Name; + if (_table.ColumnsByCsIgnore.ContainsKey(memberName)) continue; + if (_table.ColumnsByCs.TryGetValue(memberName, out var col) == false) throw new Exception($"找不到属性:{memberName}"); + var memberValue = _commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, null, initAssignExp.Expression, null); + _setIncr.Append(", ").Append(_commonUtils.QuoteSqlName(col.Attribute.Name)).Append(" = ").Append(memberValue); + } + } + return this; + } + if (body is BinaryExpression == false && + nodeType != ExpressionType.Call) return this; var cols = new List(); - var expt = _commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, cols, binaryExpression, null); + var expt = _commonExpression.ExpressionWhereLambdaNoneForeignObject(null, _table, cols, exp, null); if (cols.Any() == false) return this; foreach (var col in cols) { if (col.Column.Attribute.IsNullable == true && col.Column.Attribute.MapType.IsNullableType()) {