使用Expression 生成sql update語句的時候遇到了個問題 ,Expression<Action<T>> la 這個委托里面老獲取不到 引用類型的值,甚至連變量的值都不好獲取 只能獲取常量(ConstantExpression)的值
折騰一晚上之后終於找到解決方案
if (sqlWhere == "") return 0; Type type = typeof(T); var param = ReflectionUtil.CreateInstance(typeof(T)); string result = string.Empty; MemberInitExpression binding = (MemberInitExpression)fieldAndValueMap.Body; List<string> member = new List<string>(); foreach (MemberAssignment item in binding.Bindings) { string update = item.Member.Name + "=@" + item.Member.Name; member.Add(update); PropertyInfo property = type.GetProperty(item.Member.Name); ConstantExpression ce = null; var ExpressionType = item.Expression.GetType().Name; //UnaryExpression 有問題 if (ExpressionType == "PropertyExpression")//對象屬性 { //媽的 這里居然要轉兩次 MemberExpression innerMember0 = (MemberExpression)item.Expression; MemberExpression innerMember = (MemberExpression)(innerMember0).Expression; ce = (ConstantExpression)innerMember.Expression; PropertyInfo outerProp = (PropertyInfo)item.Member; FieldInfo innerField = (FieldInfo)innerMember.Member; object innerObj = ce.Value; object outerObj = innerField.GetValue(innerObj); object value = outerProp.GetValue(outerObj, null); ReflectionUtil.SetPropertyNotBF(param, item.Member.Name, value); } else if (ExpressionType == "FieldExpression")//字段變量 { MemberExpression innerMember = (MemberExpression)item.Expression; ce = (ConstantExpression)innerMember.Expression; PropertyInfo outerProp = (PropertyInfo)item.Member; FieldInfo innerField = (FieldInfo)innerMember.Member; object innerObj = ce.Value; object outerObj = innerField.GetValue(innerObj); ReflectionUtil.SetPropertyNotBF(param, item.Member.Name, outerObj); } else if (ExpressionType == "UnaryExpression")// { var innerMember = ((UnaryExpression)item.Expression).Operand as MemberExpression; ce = (ConstantExpression)innerMember.Expression; FieldInfo innerField = (FieldInfo)innerMember.Member; object innerObj = ce.Value; object outerObj = innerField.GetValue(innerObj); ReflectionUtil.SetPropertyNotBF(param, item.Member.Name, outerObj); } else//常量參數 { ce = (ConstantExpression)item.Expression; ReflectionUtil.SetPropertyNotBF(param, item.Member.Name, ce.Value); } } result = string.Join(",", member); var sql = string.Format("UPDATE {0} SET {1} WHERE {2}", TableName, string.Join(",", member), sqlWhere); return DapperDbSessionFactory.GetCurrentDbSession(transaction).Connection.Execute(sql, param, transaction);
可以參考 SqlSugar
然后可以這樣調用BatchUpdateFields(n => new Entity() { name= entity.name, age= entity.age, sex= entity.sex, Id = entity.Id }, " Id=@Id", null)
這樣可以值更新部分字段
主要是 PropertyExpression和FieldExpression 連個類型無法和常量一樣取值 需要進行轉換