zoukankan      html  css  js  c++  java
  • C# Expression 树转化为SQL与语句(二)--解决参数问题

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

      

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

    ====================================================================================================

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

      

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

      

    1  public class StudentHelper
    2     {
    3         public int id1  { get; set; }                   //属性
    4         public int id2;                                 //字段
    5         public static int id3 { get { return 10; } }    //静态属性
    6         public static int id4 = 20;                     //静态字段
    7      
    8     }
    一个数据类
     1   public static void Main(string[] args)
     2         {
     3             StudentHelper h = new StudentHelper();
     4             h.id1 = 1;
     5             h.id2 = 2;
     6             Expression<Func<Student, bool>> la1 = n=> n.id == h.id1;
     7             Expression<Func<Student, bool>> la2 = n=> n.id == h.id2;
     8             Expression<Func<Student, bool>> la3 = n=> n.id == StudentHelper.id3;
     9             Expression<Func<Student, bool>> la4 = n=> n.id == StudentHelper.id4;
    10             Expression<Func<Student, bool>> la5 = n=> n.id == n.new_id;
    11             test(la1,"属性");
    12             test(la2, "字段");
    13             test(la3, "静态属性");
    14             test(la4, "静态字段");
    15             test(la5, "自身参数");
    16             Console.ReadLine();
    17         }
    18         public static void test(Expression<Func<Student, bool>> la,string name)
    19         {
    20             Console.WriteLine("
    
    *****************"+name+"*********************");
    21             BinaryExpression B_exp = la.Body as BinaryExpression;
    22             Console.WriteLine("Expression类名:"+B_exp.Right.GetType().Name);
    23             MemberExpression m_exp = B_exp.Right as MemberExpression;
    24             string valueClassName = string.Empty;
    25             if (m_exp.Expression == null)
    26             {
    27                 Console.WriteLine("数据为空");
    28             }
    29             else
    30             {
    31                 valueClassName = m_exp.Expression.GetType().Name;
    32                 Console.WriteLine("数据Expression类名:" + valueClassName);
    33             }
    34             Console.WriteLine("
    
    *********************************************");
    35         }

    调试结果:

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

    具体代码如下:

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

    最后把代码嵌入进入:

    调试结果为

      

  • 相关阅读:
    NYOJ 260
    NYOJ 271
    [转载]《博客园精华集》Winform筛选结果(共105篇)
    在DataGridView控件中加入ComboBox下拉列表框的实现
    给SQL补充一个查看表结构的存储过程
    编写自定义控件之下拉式属性
    PropertyGrid中的枚举显示为中文(转)
    DataGridView 中合并单元格
    树TreeView控件与DataTable交互添加节点(最高效的方法)
    通过键盘方向键控制TreeView节点的移动
  • 原文地址:https://www.cnblogs.com/linxingxunyan/p/6486088.html
Copyright © 2011-2022 走看看