c# 使用Expression 生成sql


使用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 連個類型無法和常量一樣取值 需要進行轉換

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM