使用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 连个类型无法和常量一样取值 需要进行转换

c# 使用Expression 生成sql的更多相关文章

  1. 自己动手写ORM(01):解析表达式树生成Sql碎片

     在EF中,我们查询数据时可能会用拉姆达表达式 Where(Func<T,ture> func)这个方法来筛选数据,例如,我们定义一个User实体类 public class User { ...

  2. PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决。。。

    PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决... 1.当你的PowerDesigner 是新安装时,你得设置可能就会出现一些问题,在这里比如:PDM生成 ...

  3. django 有model生成SQL以及现有反向表生成model

    已有models生成SQL语句 语法 python manage.py sqlall app_name   # app_name, 在settings已经导入, 如: INSTALLED_APPS = ...

  4. 快速将一个表的数据生成SQL插入语句

    将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...

  5. access生成sql脚本,通过VBA调用ADOX

    access生成sql脚本,通过VBA调用ADOX. 使用 MS Access 2016 的VBA,读取mdb文件中的所有表结构(数据类型/长度/精度等),生成对应的SQL create table语 ...

  6. Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询

    Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询     SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...

  7. 由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。

    错误:由于启动用户实例的进程时出错,导致无法生成SQL Server的用户实例. 原因:添加安装SQLEXPRESS时,估计装在了不同的目录下: 解决方法:关闭Sqlserver及相关的程序,删除目录 ...

  8. PowerDesigner生成sql及HTML格式数据库文档

    一.PowerDesigner生成sql问题 生成sql的方法是 Database -->Generate Database (Ctrl + G ) 但是提示 Could not load VB ...

  9. 把excel数据生成sql insert语句

    excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...

随机推荐

  1. ssh 登陆免 known_hosts 提示

    修改配置文件 “~/.ssh/config”,加上这两行,重启服务器: StrictHostKeyChecking no UserKnownHostsFile /dev/null

  2. node 创建静态web服务器(下)(处理异步获取数据的两种方式)

    接上一章. 上一章我们说创建的静态web服务器只能识别html,css,js文件,功能较为单一,且图片格式为text/html,这是不合理的. 本章,我们将解决该问题. 这里,我们先准备好一个json ...

  3. Java.util.ArrayDeque类

    java.util.ArrayDeque 类提供了可调整大小的阵列,并实现了Deque接口.以下是关于阵列双端队列的要点: 数组双端队列没有容量限制,使他们增长为必要支持使用. 它们不是线程安全的;如 ...

  4. 条件sql ibatis

    <!-- 多条件查询 --><select id="MS-CUSTOM-PANDECT-INFO-BY-CONDITIONS" resultMap="R ...

  5. linux 查看服务器序列号(S/N)

    [root@node1~]# dmidecode -t 查看支持的参数 dmidecode: option requires an argument -- 't' Type number or key ...

  6. this.$router.push

    跳转详情页this.$router.push({ path: `/activityDetails/${id}` })

  7. kubeadm部署一个Kubernetes集群

    kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具.这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Master 节点 $ kubeadm in ...

  8. Delphi 取整函数round、trunc、ceil和floor

    Delphi 取整函数round.trunc.ceil和floor 1.Round(四舍六入五留双)功能说明:对一个实数进行四舍五入.(按照银行家算法)例:var i, j: Integer;begi ...

  9. Swift 环境搭建

    Swift 环境搭建 Swift是一门开源的编程语言,该语言用于开发OS X和iOS应用程序. 在正式开发应用程序前,我们需要搭建Swift开发环境,以便更好友好的使用各种开发工具和语言进行快速应用开 ...

  10. windows启动redis失败

    # Warning: no config file specified, using the default config. In order to specify a config file use ...