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 连个类型无法和常量一样取值 需要进行转换
c# 使用Expression 生成sql的更多相关文章
- 自己动手写ORM(01):解析表达式树生成Sql碎片
在EF中,我们查询数据时可能会用拉姆达表达式 Where(Func<T,ture> func)这个方法来筛选数据,例如,我们定义一个User实体类 public class User { ...
- PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决。。。
PowerDesigner PDM生成sql脚本时:表的名称和表里面的字段名称都有引号解决... 1.当你的PowerDesigner 是新安装时,你得设置可能就会出现一些问题,在这里比如:PDM生成 ...
- django 有model生成SQL以及现有反向表生成model
已有models生成SQL语句 语法 python manage.py sqlall app_name # app_name, 在settings已经导入, 如: INSTALLED_APPS = ...
- 快速将一个表的数据生成SQL插入语句
将一个表中的数据生成SQL插入语句,方便系统快速初始化,在数据库中执行创建以下过程就可以了. ) Drop Procedure GenerateData go CREATE PROCEDURE Gen ...
- access生成sql脚本,通过VBA调用ADOX
access生成sql脚本,通过VBA调用ADOX. 使用 MS Access 2016 的VBA,读取mdb文件中的所有表结构(数据类型/长度/精度等),生成对应的SQL create table语 ...
- Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询
Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询 SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...
- 由于启动用户实例的进程时出错,导致无法生成 SQL Server 的用户实例。该连接将关闭。
错误:由于启动用户实例的进程时出错,导致无法生成SQL Server的用户实例. 原因:添加安装SQLEXPRESS时,估计装在了不同的目录下: 解决方法:关闭Sqlserver及相关的程序,删除目录 ...
- PowerDesigner生成sql及HTML格式数据库文档
一.PowerDesigner生成sql问题 生成sql的方法是 Database -->Generate Database (Ctrl + G ) 但是提示 Could not load VB ...
- 把excel数据生成sql insert语句
excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: ...
随机推荐
- 前端(十二)—— JavaScript基础操作:if语句、for循环、while循环、for...in、for...of、异常处理、函数、事件、JS选择器、JS操作页面样式
JavaScript基础操作 一.分支结构 1.if语句 if 基础语法 if (条件表达式) { 代码块; } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通 ...
- 面向对象(三)——组合、多态、封装、property装饰器
组合.多态.封装.property装饰器 一.组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo(): pass class Bar(): pas ...
- SOA(面向服务的体系结构)
SOA(面向服务的体系结构) 面向服务的体系结构是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来.接口是采用中立的方式进行定义的,它应该独立于实现服务 ...
- NIO 源码分析(03) 从 BIO 到 NIO
目录 一.NIO 三大组件 Channels.Buffers.Selectors 1.1 Channel 和 Buffer 1.2 Selector 1.3 Linux IO 和 NIO 编程的区别 ...
- Neo4j:Index索引
Indexing in Neo4j: An Overview by Stefan Armbruster · Jan. 06, 14 · Java Zone Neo4j是一个图数据库,在做图的检索时,用 ...
- htons(), ntohl(), ntohs(),htons()这4个函数(摘)
在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl(), ntohs(),htons()这4个函数.网络字节顺序与本地字节顺序之间的转换 ...
- windows平板软件开机自启动+霸屏的操作方法
转载(忘了地址) 很好很强大.成功亲测 使用你自己的账号(最好是管理员权限的账号)登录Windows,然后添加一个给其他人使用的账户(假设为other),注意一定要为other设置密码. 运行 ...
- Ubuntu 更新国内镜像源失败
Ubuntu 更新国内镜像源失败 首先打开系统原来的/etc/apt/sources.list 查看,原来的仓库地址是 https 还是 http 如果是http那么说明本机的 CA 证书有问题,运行 ...
- vue computed和methods 计算属性和侦听器
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- thymeleaf种处理select,radio和文字回显的问题
select根据后台集合显示下列列表 <select class="form-control" name="parentId" > <opti ...