SqlSugar更新分为2大类写法,1种是传实体对象的方式 这种是以实体对象为核心进行更新,不传实体对象这种是以表达式为核心进行更新
//传实体对象写法(支持批量对象) db.Updateable(updateObj) //不传实体对象写法 db.Updateable<T>()
传对象的用法
根据实体更新(主键要有值,主键是更新条件)
var t1 = db.Updateable(updateObj).ExecuteCommand(); //这种方式会以主键为条件
4.2.3添加了WhereColumns 虽然XId不是主键但是 XId作为更新条件
var t1 = db.Updateable(updateObj).WhereColumns(it=>new{it.XId}).ExecuteCommand();//单列可以用 it=>it.XId
//需要注意 当WhereColumns和UpdateColumns一起用时,需要把wherecolumns中的列加到UpdateColumns中
var update = db.Updateable(updateObj).UpdateColumns(s => new { s.RowStatus,s.Id }).WhereColumns(it => new { it.Id });只更新实体里面的Name列(主键要有值,主键是更新条件)
var t3 = db.Updateable(updateObj).UpdateColumns(it => new { it.Name }).ExecuteCommand();更新 Name和 TestId 以外的所有列 (主键要有值,主键是更新条件)
var t4 = db.Updateable(updateObj)
.IgnoreColumns(it => new { it.Name, it.TestId }).ExecuteCommand();更新NAME 以外的所有列
var t5 = db.Updateable(updateObj) .IgnoreColumns(it => it=="name" ).ExecuteCommand(); //name列不更新 var t5 = db.Updateable(updateObj) .IgnoreColumns(it => list.Contains(it) ).ExecuteCommand(); //List中所有列不更新
使用锁
var t6 = db.Updateable(updateObj).With(SqlWith.UpdLock).ExecuteCommand();
批量更新(主键要有值,主键是更新条件)
List<Students> list=GetList(); var t7 = db.Updateable(list).ExecuteCommand();
实体更新,并且给Name重新赋值 ,其它列也会更新
var t8 = db.Updateable(updateObj) .ReSetValue(it => it.Name == (it.Name + 1)).ExecuteCommand();
只更新Name并且 Name的值等于Name+1, 如果updateObj值为NULL一定要加WHERE才可以
//写法1
var t8 = db.Updateable(updateObj)
.UpdateColumns(it=>new {it.Name}).ReSetValue(it => it.Name == (it.Name + 1)).ExecuteCommand();第一种updateable()有参数的,下面二种是没参数的注意下区别
更新实体,更新条件是根据表达式
var t9 = db.Updateable(updateObj).Where(it => it.Id == 1).ExecuteCommand();
是NULL的列不更新
db.Updateable(updateObj).IgnoreColumns(ignoreAllNullColumns:true).ExecuteCommand();
4.6.4.8 版本支持了不需要泛型的字典
//如果initKey.Systemtable方是写法
var dt = new Dictionary<string,object>();
dt.Add("id", 1);
dt.Add("name", "1");
var t66 = db.Updateable(dt).AS("student").ExecuteCommand();
//UPDATE STUDENT SET NAME=@name WHERE ID=@ID
//如果initkey.Attribute方式是拿不出主键信息的需要写成这样
var dt = new Dictionary<string,object>();
dt.Add("id", 1);
dt.Add("name", "1");
var t66 = db.Updateable(dt).AS("student").WhereColumns("id").With(SqlWith.UpdLock).ExecuteCommand()
//没有WhereColumns(string)去下载最新的
//也支持List<Dictionary<string,object>>4.2.2 更新 匿名对象和字典的支持
var t13 = db.Updateable<Student>(new { Name = "a", id=1 }).ExecuteCommand();
//UPDATE [STudent] SET [Name]='a' WHERE [Id]=1
var t14 = db.Updateable<Student>(new Dictionary<string, object>() { { "id", 1 }, { "name", "a" } }).ExecuteCommand();
//UPDATE [STudent] SET [Name]='a' WHERE [Id]=1不传对象的用法
根据表达式中的列更新 ,只更新 Name和CreateTime 条件是id=11,比较常用
//正确写法
var t10 = db.Updateable<Student>()
.UpdateColumns(it => new Student() { Name = "a", CreateTime = DateTime.Now })
.Where(it => it.Id == 11).ExecuteCommand();
//错误写法
var st=new Student() { Name = "a", CreateTime = DateTime.Now };
var t10 = db.Updateable<Student>()
.UpdateColumns(it => st)
.Where(it => it.Id == 11).ExecuteCommand();别名表
db.Updateable<School>().AS("Student")
.UpdateColumns(it => new School() { Name = "jack" })
.Where(it => it.Id == 1).ExecuteCommand();
//Update Student set Name='jack' Where Id=14.6.0.7 联表更新
var t17 = db.Updateable<Student>().UpdateColumns(it =>
new Student(){
SchoolId = SqlFunc.Subqueryable<School>().Where(s => s.Id == it.SchoolId).Select(s => s.Id),
Name = "newname"
}).Where(it => it.Id == 1).ExecuteCommand();UPDATE [STudent] SET [SchoolId] = (SELECT TOP 1 [Id] FROM [School] WHERE ( [Id] =[STudent].[SchoolId] )) , [Name] = @Const0 WHERE ( [ID] = @Id1 )
只更新Name并且 Name的值等于Name+1
//写法1
var t8 = db.Updateable<Student>().UpdateColumns(it => new Student() { Name = it.Name+1}).Where(it => it.Id == 11).ExecuteCommand();
//写法2 (注意:4.5.9.8以上版本支持) 如果只有一列可以简化成这种写法
var t8= db.Updateable<Student>().UpdateColumns(it => it.Name == it.Name+1).Where(it => it.Id == 11).ExecuteCommand();技巧功能
//根据不同条件执行更新不同的列
var t3 = db.Updateable(updateObj)
.UpdateColumnsIF(caseValue=="1",it => new { it.Name })
.UpdateColumnsIF(caseValue=="2", it => new { it.Name,it.CreateTime })
.ExecuteCommand();例如我想验证我表单传过来的数据在数据库是否是最新的版本,不是最新版本抛出提示,
参考这个DEMO
2016 © donet5.comApache Licence 2.0