使用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. 前端(十二)—— JavaScript基础操作:if语句、for循环、while循环、for...in、for...of、异常处理、函数、事件、JS选择器、JS操作页面样式

    JavaScript基础操作 一.分支结构 1.if语句 if 基础语法 if (条件表达式) { 代码块; } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通 ...

  2. 面向对象(三)——组合、多态、封装、property装饰器

    组合.多态.封装.property装饰器 一.组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo(): pass class Bar(): pas ...

  3. SOA(面向服务的体系结构)

    SOA(面向服务的体系结构) 面向服务的体系结构是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务 ...

  4. NIO 源码分析(03) 从 BIO 到 NIO

    目录 一.NIO 三大组件 Channels.Buffers.Selectors 1.1 Channel 和 Buffer 1.2 Selector 1.3 Linux IO 和 NIO 编程的区别 ...

  5. Neo4j:Index索引

    Indexing in Neo4j: An Overview by Stefan Armbruster · Jan. 06, 14 · Java Zone Neo4j是一个图数据库,在做图的检索时,用 ...

  6. htons(), ntohl(), ntohs(),htons()这4个函数(摘)

    在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数.网络字节顺序与本地字节顺序之间的转换 ...

  7. windows平板软件开机自启动+霸屏的操作方法

        转载(忘了地址) 很好很强大.成功亲测 使用你自己的账号(最好是管理员权限的账号)登录Windows,然后添加一个给其他人使用的账户(假设为other),注意一定要为other设置密码. 运行 ...

  8. Ubuntu 更新国内镜像源失败

    Ubuntu 更新国内镜像源失败 首先打开系统原来的/etc/apt/sources.list 查看,原来的仓库地址是 https 还是 http 如果是http那么说明本机的 CA 证书有问题,运行 ...

  9. vue computed和methods 计算属性和侦听器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. thymeleaf种处理select,radio和文字回显的问题

    select根据后台集合显示下列列表 <select class="form-control" name="parentId" > <opti ...