在用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. crontab中使用sudo命令的注意

    在使用crontab执行非root用户定时任务时,有时候shell脚本里需要用到sudo以获得root权限: 如: VIP_CARD=eth0 VIP_ADDR=192.168.4.119 NETMA ...

  2. js中深拷贝代码实现

    function copy(original,o){ if(typeof original != 'object') return original; var o = o || (Array.isAr ...

  3. C语言-100加减求和

    ----------------------------度娘的思路------------------------------------------------------ Action() { / ...

  4. python面向对象的成员、属性等

    #类成员: #字段 self.xy =qq . xy=qq #普通字段 (保存在对象里面) #直接通过点(.)+ 字段 进行调用 #静态字段 (保存在类里面) #静态字段属于类,在内存只保留一份 . ...

  5. 优动漫PAINT-朱槿花的画法

    火红夺目的朱槿花,绝对是烘托画面的绝佳布景!画法发非常简单,毫无绘画基础的人也能够将它很好的呈现出来哟~ 教程是简单,呃.... 没有优动漫PAINT软件肿么办? 别着急,╭(╯^╰)╮ 小编给你送来 ...

  6. 视图层 view

    视图层是 Django 处理请求的核心代码层,我们大多数 Python 代码都集中在这一层面.它对外接收用户请求,对内调度模型层和模版层,统合数据库和前端,最后根据业务逻辑,将处理好的数据,与前端结合 ...

  7. VC++ 借助 Win32 API 绘图实现基本的细胞自动机演示

    //本程序使用 Visual Studio 2015 生成的 Win32 窗口程序模板 开发//使用 Win32 API 绘图//实现基本的细胞自动机演示////目前已知问题://存在内存泄漏,但具体 ...

  8. 紫书 例题8-8 UVa 1471 (用set实现动态二分)

    设切割的区间为(j, i), 注意两边都是开区间. 然后可以预处理出以i为起点的最长连续递增的长度和以j为终点的最长连续递增的长度. 大致思路就是枚举i,右边这一侧的最优值就知道了, 然后这道题的关键 ...

  9. C语言编译和链接

    编译链接是使用高级语言编程所必须的操作,一个源程序只有经过编译.链接操作以后才可以变成计算机可以理解并执行的二进制可执行文件. 编译是指根据用户写的源程序代码,经过词法和语法分析,将高级语言编写的代码 ...

  10. 很好的DP思路,字符串比较次数

    题目: https://leetcode.com/problems/distinct-subsequences/?tab=Description 一般没有明显思路的情况下,都要想想DP,用下Divid ...