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语句,方法如下: ...
随机推荐
- FreeBSD_11-系统管理——{Part_a-bhyve}
;; 创建 vm: #!/usr/bin/env zsh bridgeIF=bridge0 laggIF=lagg0 tapIF=tap0 phyIF_0=re0 phyIF_1=em0 isoPat ...
- Ibatis sql语句1
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE sqlMap PUBLIC "-/ ...
- NIO 源码分析(02-2) BIO 源码分析 Socket
目录 一.BIO 最简使用姿势 二.connect 方法 2.1 Socket.connect 方法 2.2 AbstractPlainSocketImpl.connect 方法 2.3 DualSt ...
- webpack2诸类事宜
写在最前:webpack的总结也是自己坑过,实践过但是也是针对性的使用,在加上webpack的背景,对于其‘原理’方面有很大的不正确的理解,有错误的地方,请尽情指出(乖巧~) 由于版本遇到的问题: 在 ...
- Pandas中的DataFrame按指定顺序输出所有列的方法
问题: 输出新建的DataFrame对象时,DataFrame中各列的显示顺序和DataFrame定义中的顺序不一致. 例如: import pandas as pd grades = [48,99, ...
- HTML5 Canvas知识点学习笔记
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/huangyibin628/article/details/30108165 canvas ① 主要作 ...
- JQuery日记6.7 Javascript异步模型(二)
异步模型看起来非常美,但事实上它也是有天生缺陷的.看以下代码 try { setTimeout( function(){ throw new Error( '你抓不到我的!' ); }, 100); ...
- 微信小程序开发系列之Hello World
第一步:注册 在微信公众平台官网首页,点击注册.(相关文档可以找到,这里不再累述,望见谅.) 微信小程序注册成功后界面 第二步:编辑器.开发工具 我们假定你已经申请注册好微信小程序了,我们选定一个代码 ...
- workman
workman安装: 环境安装: 检测依赖环境是否安装 rpm -qa | grep “软件或者包的名字”或者 yum list installed eg: rpm -qa | grep libeve ...
- nodejs mysql 连接数据库
1.设计数据库 2.设计数据库表 3.下载MySQL模块 npm install --save mysql 4.编写代码 const mysql=require('mysql'); //1.连接 // ...