在用Expression解析的的时候碰到一些参数(不是具体的值),会出现这种情况。

  

  在这里我们希望得到的是id=10,而不是id=m_id;那如何来解析这些参数?

====================================================================================================\

  首先参数分为2中,一种是n.id,这种可以说是一种形参,没有具体的数据只是泛型中的一个属性,这种应该被解析成字符串id,另外一种是m_id,这种是有具体的值得,我们希望它解析成具体的值(10)而不是m_id。在Expression的子类中的MemberExpression类接收。我们来看看MemberExpression的信息

  

  我们可以通过MemberExpression类的Expression 来确定参数的类型,判断这个参数是那种类型。

  

  public class StudentHelper
{
public int id1 { get; set; } //属性
public int id2; //字段
public static int id3 { get { return ; } } //静态属性
public static int id4 = ; //静态字段 }

一个数据类

   public static void Main(string[] args)
{
StudentHelper h = new StudentHelper();
h.id1 = ;
h.id2 = ;
Expression<Func<Student, bool>> la1 = n=> n.id == h.id1;
Expression<Func<Student, bool>> la2 = n=> n.id == h.id2;
Expression<Func<Student, bool>> la3 = n=> n.id == StudentHelper.id3;
Expression<Func<Student, bool>> la4 = n=> n.id == StudentHelper.id4;
Expression<Func<Student, bool>> la5 = n=> n.id == n.new_id;
test(la1,"属性");
test(la2, "字段");
test(la3, "静态属性");
test(la4, "静态字段");
test(la5, "自身参数");
Console.ReadLine();
}
public static void test(Expression<Func<Student, bool>> la,string name)
{
Console.WriteLine("\n\n*****************"+name+"*********************");
BinaryExpression B_exp = la.Body as BinaryExpression;
Console.WriteLine("Expression类名:"+B_exp.Right.GetType().Name);
MemberExpression m_exp = B_exp.Right as MemberExpression;
string valueClassName = string.Empty;
if (m_exp.Expression == null)
{
Console.WriteLine("数据为空");
}
else
{
valueClassName = m_exp.Expression.GetType().Name;
Console.WriteLine("数据Expression类名:" + valueClassName);
}
Console.WriteLine("\n\n*********************************************");
}

调试结果:

通过调试结果可以看到自身的参数其数据对象为类型TypedParameterExpression,不是有2中可能静态的字段和属性其数据对象为空,有则为FieldExpression类型。判断完后就可以把表达式当成委托编译出来。

具体代码如下:

 public static object Eval(MemberExpression member)
{
UnaryExpression cast = Expression.Convert(member, typeof(object));
object obj = Expression.Lambda<Func<object>>(cast).Compile().Invoke();
return obj;
}

最后把代码嵌入进入:

调试结果为

  

C# Expression 树转化为SQL与语句(二)--解决参数问题的更多相关文章

  1. C# Expression 树转化为SQL语句(一)

    sql有有四中基本语句,分别是增删改查,在建立model后如何生成这四中sql语句,降低开发时间. 我们先模拟出一张学生表: public class Student { public int id ...

  2. android之Android中的SQL查询语句LIKE绑定参数问题解决办法(sqlite数据库)

    由于考虑到数据库的安全性,不被轻易SQL注入,执行查询语句时,一般不使用直接拼接的语句,而是使用参数传递的方法.然后在使用参数传递的方法中时,发现当使用like方式查询数据时,很容易出现一个问题. 错 ...

  3. (转)经典SQL查询语句大全

    (转)经典SQL查询语句大全 一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql s ...

  4. 经典SQL查询语句大全

    一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数 ...

  5. SQL查询语句大全及其理解

    转自:https://www.cnblogs.com/1234abcd/p/5530314.html 一.基础1.说明:创建数据库CREATE DATABASE database-name2.说明:删 ...

  6. Excel数据转化为sql脚本

    在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...

  7. [转]Excel数据转化为sql脚本

    在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...

  8. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

  9. 2 日志系统:一条sql更新语句是如何执行的?

    2 日志系统:一条sql更新语句是如何执行的? 前面了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块,一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后达到e ...

随机推荐

  1. RabbitMQ笔记(3)

    消息从产生--->结束 1.生产者--->交换机--->队列--->消费者 2.生产者--->交换机--->队列 首先: 生产者:Exchange = n:1 Ex ...

  2. STM8S103内存详析

    STM8S103的RAM有1k,0x00-0x3FF(RAM和ROM统一编址),其中0x200-0x3ff共512个字节默认为堆栈,剩余的低端512个字节又分为了Zero Page和剩余的RAM(简称 ...

  3. 根据SPID查找SQL语句

      SELECT   /*+ ORDERED */          sql_text     FROM v$sqltext a    WHERE (a.hash_value, a.address) ...

  4. swift语言点评十九-类型转化与检查

    1.oc比较: -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例 -(BOOL) isMemberOfClass: classObj 判断是否是这个 ...

  5. Python内置数据结构之字符串str

    1. 数据结构回顾 所有标准序列操作(索引.切片.乘法.成员资格检查.长度.最小值和最大值)都适用于字符串,但是字符串是不可变序列,因此所有的元素赋值和切片赋值都是非法的. >>> ...

  6. Node_进阶_3

    Express框架: 一.   Express框架 Express框架是后台的Node框架,类似于JS中的jquery. #原生Node开发会有很多问题: 1呈递静态页面很不方便,需要处理每个HTTP ...

  7. webpack 操作

    依赖安装 :  全局安装webpack : sudo npm install webpack -g 本地安装webpack : npm install webpack —save-dev  需要注意的 ...

  8. 【图灵杯 E也即POJ 3368】简单的RMQ

    Description 给定一个数组,其中的元素满足非递减顺序.任意给定一个区间[i,j],求其中某个元素重复出现的最大次数. Input 多组数据输入.每组数据的第一行包含两个整数n和q(1< ...

  9. ASP.NET-本地化、全球化

    在<system.web>中加入一个全球化的标识,网站就可以自适应全球化了 也可以将出错信息全球化 上面的这种方式测试过对google浏览器好像没用,但是对IE内核的是可行的,可能goog ...

  10. 不安装Oracle客户端,用plsql连接远程Oracle数据库(绝对解决你的问题)

    1,首先准备下载两个软件,一个是instantclient.zip,另一个是plsql安装包.但是得确定您的电脑是32位还是64位,我这边提供了32位和64位的供您下载: 百度网盘:https://p ...