zoukankan      html  css  js  c++  java
  • DMSLinq表达式框架实现(二)

    DMSExpressionVisitor类重写,其实这个类就是System.Linq下面的ExpressionVisitor类,改它也是因为更好控制我们的SQL语句而已.

    下面贴出代码:

    View Code
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Linq.Expressions;
      6 using System.Collections.ObjectModel;
      7 
      8 namespace KingNET.DMSFrame.DMSLinq
      9 {
     10     public abstract class DMSExpressionVisitor
     11     {
     12         protected virtual Expression Visit(Expression exp)
     13         {
     14             if (exp == null)
     15             {
     16                 return exp;
     17             }
     18             switch (exp.NodeType)
     19             {
     20                 case ExpressionType.Add:
     21                 case ExpressionType.AddChecked:
     22                 case ExpressionType.And:
     23                 case ExpressionType.AndAlso:
     24                 case ExpressionType.ArrayIndex:
     25                 case ExpressionType.Coalesce:
     26                 case ExpressionType.Divide:
     27                 case ExpressionType.Equal:
     28                 case ExpressionType.ExclusiveOr:
     29                 case ExpressionType.GreaterThan:
     30                 case ExpressionType.GreaterThanOrEqual:
     31                 case ExpressionType.LeftShift:
     32                 case ExpressionType.LessThan:
     33                 case ExpressionType.LessThanOrEqual:
     34                 case ExpressionType.Modulo:
     35                 case ExpressionType.Multiply:
     36                 case ExpressionType.MultiplyChecked:
     37                 case ExpressionType.NotEqual:
     38                 case ExpressionType.Or:
     39                 case ExpressionType.OrElse:
     40                 case ExpressionType.RightShift:
     41                 case ExpressionType.Subtract:
     42                 case ExpressionType.SubtractChecked:
     43                     return this.VisitBinary((BinaryExpression)exp);
     44 
     45                 case ExpressionType.ArrayLength:
     46                 case ExpressionType.Convert:
     47                 case ExpressionType.ConvertChecked:
     48                 case ExpressionType.Negate:
     49                 case ExpressionType.NegateChecked:
     50                 case ExpressionType.Not:
     51                 case ExpressionType.Quote:
     52                 case ExpressionType.TypeAs:
     53                     return this.VisitUnary((UnaryExpression)exp);
     54 
     55                 case ExpressionType.Call:
     56                     return this.VisitMethodCall((MethodCallExpression)exp);
     57 
     58                 case ExpressionType.Conditional:
     59                     return this.VisitConditional((ConditionalExpression)exp);
     60 
     61                 case ExpressionType.Constant:
     62                     return this.VisitConstant((ConstantExpression)exp);
     63 
     64                 case ExpressionType.Invoke:
     65                     return this.VisitInvocation((InvocationExpression)exp);
     66 
     67                 case ExpressionType.Lambda:
     68                     return this.VisitLambda((LambdaExpression)exp);
     69 
     70                 case ExpressionType.ListInit:
     71                     return this.VisitListInit((ListInitExpression)exp);
     72 
     73                 case ExpressionType.MemberAccess:
     74                     return this.VisitMemberAccess((MemberExpression)exp);
     75 
     76                 case ExpressionType.MemberInit:
     77                     return this.VisitMemberInit((MemberInitExpression)exp);
     78 
     79                 case ExpressionType.New:
     80                     return this.VisitNew((NewExpression)exp);
     81 
     82                 case ExpressionType.NewArrayInit:
     83                 case ExpressionType.NewArrayBounds:
     84                     return this.VisitNewArray((NewArrayExpression)exp);
     85 
     86                 case ExpressionType.Parameter:
     87                     return this.VisitParameter((ParameterExpression)exp);
     88 
     89                 case ExpressionType.TypeIs:
     90                     return this.VisitTypeIs((TypeBinaryExpression)exp);
     91 
     92             }
     93             throw new Exception(string.Format("Unhandled expression type: '{0}'", exp.NodeType));
     94         }
     95         protected virtual MemberBinding VisitBinding(MemberBinding binding)
     96         {
     97             switch (binding.BindingType)
     98             {
     99                 case MemberBindingType.Assignment:
    100                     return this.VisitMemberAssignment((MemberAssignment)binding);
    101 
    102                 case MemberBindingType.MemberBinding:
    103                     return this.VisitMemberMemberBinding((MemberMemberBinding)binding);
    104 
    105                 case MemberBindingType.ListBinding:
    106                     return this.VisitMemberListBinding((MemberListBinding)binding);
    107 
    108                 default:
    109                     throw new Exception(string.Format("Unhandled binding type '{0}'", binding.BindingType));
    110             }
    111         }
    112         protected virtual ElementInit VisitElementInitializer(ElementInit initializer)
    113         {
    114             ReadOnlyCollection<Expression> readOnlyCollection = this.VisitExpressionList(initializer.Arguments);
    115             if (readOnlyCollection != initializer.Arguments)
    116             {
    117                 return Expression.ElementInit(initializer.AddMethod, readOnlyCollection);
    118             }
    119             return initializer;
    120         }
    121         protected virtual Expression VisitUnary(UnaryExpression u)
    122         {
    123             Expression expression = this.Visit(u.Operand);
    124             if (expression != u.Operand)
    125             {
    126                 return Expression.MakeUnary(u.NodeType, expression, u.Type, u.Method);
    127             }
    128             return u;
    129         }
    130         protected virtual Expression VisitBinary(BinaryExpression b)
    131         {
    132             Expression expression = this.Visit(b.Left);
    133             Expression expression2 = this.Visit(b.Right);
    134             Expression expression3 = this.Visit(b.Conversion);
    135             if (expression == b.Left && expression2 == b.Right && expression3 == b.Conversion)
    136             {
    137                 return b;
    138             }
    139             if (b.NodeType == ExpressionType.Coalesce && b.Conversion != null)
    140             {
    141                 return Expression.Coalesce(expression, expression2, expression3 as LambdaExpression);
    142             }
    143             return Expression.MakeBinary(b.NodeType, expression, expression2, b.IsLiftedToNull, b.Method);
    144         }
    145         protected virtual Expression VisitTypeIs(TypeBinaryExpression b)
    146         {
    147             Expression expression = this.Visit(b.Expression);
    148             if (expression != b.Expression)
    149             {
    150                 return Expression.TypeIs(expression, b.TypeOperand);
    151             }
    152             return b;
    153         }
    154         protected virtual Expression VisitConstant(ConstantExpression c)
    155         {
    156             return c;
    157         }
    158         protected virtual Expression VisitConditional(ConditionalExpression c)
    159         {
    160             Expression expression = this.Visit(c.Test);
    161             Expression expression2 = this.Visit(c.IfTrue);
    162             Expression expression3 = this.Visit(c.IfFalse);
    163             if (expression != c.Test || expression2 != c.IfTrue || expression3 != c.IfFalse)
    164             {
    165                 return Expression.Condition(expression, expression2, expression3);
    166             }
    167             return c;
    168         }
    169         protected virtual Expression VisitParameter(ParameterExpression p)
    170         {
    171             return p;
    172         }
    173         protected virtual Expression VisitMemberAccess(MemberExpression m)
    174         {
    175             Expression expression = this.Visit(m.Expression);
    176             if (expression != m.Expression)
    177             {
    178                 return Expression.MakeMemberAccess(expression, m.Member);
    179             }
    180             return m;
    181         }
    182         protected virtual Expression VisitMethodCall(MethodCallExpression m)
    183         {
    184             Expression expression = this.Visit(m.Object);
    185             IEnumerable<Expression> enumerable = this.VisitExpressionList(m.Arguments);
    186             if (expression != m.Object || enumerable != m.Arguments)
    187             {
    188                 return Expression.Call(expression, m.Method, enumerable);
    189             }
    190             return m;
    191         }
    192         protected virtual ReadOnlyCollection<Expression> VisitExpressionList(ReadOnlyCollection<Expression> original)
    193         {
    194             List<Expression> list = null;
    195             int i = 0;
    196             int count = original.Count;
    197             while (i < count)
    198             {
    199                 Expression expression = this.Visit(original[i]);
    200                 if (list != null)
    201                 {
    202                     list.Add(expression);
    203                 }
    204                 else
    205                 {
    206                     if (expression != original[i])
    207                     {
    208                         list = new List<Expression>(count);
    209                         for (int j = 0; j < i; j++)
    210                         {
    211                             list.Add(original[j]);
    212                         }
    213                         list.Add(expression);
    214                     }
    215                 }
    216                 i++;
    217             }
    218             if (list != null)
    219             {
    220                 return list.AsReadOnly();
    221             }
    222             return original;
    223         }
    224         protected virtual MemberAssignment VisitMemberAssignment(MemberAssignment assignment)
    225         {
    226             Expression expression = this.Visit(assignment.Expression);
    227             if (expression != assignment.Expression)
    228             {
    229                 return Expression.Bind(assignment.Member, expression);
    230             }
    231             return assignment;
    232         }
    233         protected virtual MemberMemberBinding VisitMemberMemberBinding(MemberMemberBinding binding)
    234         {
    235             IEnumerable<MemberBinding> enumerable = this.VisitBindingList(binding.Bindings);
    236             if (enumerable != binding.Bindings)
    237             {
    238                 return Expression.MemberBind(binding.Member, enumerable);
    239             }
    240             return binding;
    241         }
    242         protected virtual MemberListBinding VisitMemberListBinding(MemberListBinding binding)
    243         {
    244             IEnumerable<ElementInit> enumerable = this.VisitElementInitializerList(binding.Initializers);
    245             if (enumerable != binding.Initializers)
    246             {
    247                 return Expression.ListBind(binding.Member, enumerable);
    248             }
    249             return binding;
    250         }
    251         protected virtual IEnumerable<MemberBinding> VisitBindingList(ReadOnlyCollection<MemberBinding> original)
    252         {
    253             List<MemberBinding> list = null;
    254             int i = 0;
    255             int count = original.Count;
    256             while (i < count)
    257             {
    258                 MemberBinding memberBinding = this.VisitBinding(original[i]);
    259                 if (list != null)
    260                 {
    261                     list.Add(memberBinding);
    262                 }
    263                 else
    264                 {
    265                     if (memberBinding != original[i])
    266                     {
    267                         list = new List<MemberBinding>(count);
    268                         for (int j = 0; j < i; j++)
    269                         {
    270                             list.Add(original[j]);
    271                         }
    272                         list.Add(memberBinding);
    273                     }
    274                 }
    275                 i++;
    276             }
    277             if (list != null)
    278             {
    279                 return list;
    280             }
    281             return original;
    282         }
    283         protected virtual IEnumerable<ElementInit> VisitElementInitializerList(ReadOnlyCollection<ElementInit> original)
    284         {
    285             List<ElementInit> list = null;
    286             int i = 0;
    287             int count = original.Count;
    288             while (i < count)
    289             {
    290                 ElementInit elementInit = this.VisitElementInitializer(original[i]);
    291                 if (list != null)
    292                 {
    293                     list.Add(elementInit);
    294                 }
    295                 else
    296                 {
    297                     if (elementInit != original[i])
    298                     {
    299                         list = new List<ElementInit>(count);
    300                         for (int j = 0; j < i; j++)
    301                         {
    302                             list.Add(original[j]);
    303                         }
    304                         list.Add(elementInit);
    305                     }
    306                 }
    307                 i++;
    308             }
    309             if (list != null)
    310             {
    311                 return list;
    312             }
    313             return original;
    314         }
    315         protected virtual Expression VisitLambda(LambdaExpression lambda)
    316         {
    317             Expression expression = this.Visit(lambda.Body);
    318             if (expression != lambda.Body)
    319             {
    320                 return Expression.Lambda(lambda.Type, expression, lambda.Parameters);
    321             }
    322             return lambda;
    323         }
    324         protected virtual NewExpression VisitNew(NewExpression nex)
    325         {
    326             IEnumerable<Expression> enumerable = this.VisitExpressionList(nex.Arguments);
    327             if (enumerable == nex.Arguments)
    328             {
    329                 return nex;
    330             }
    331             if (nex.Members != null)
    332             {
    333                 return Expression.New(nex.Constructor, enumerable, nex.Members);
    334             }
    335             return Expression.New(nex.Constructor, enumerable);
    336         }
    337         protected virtual Expression VisitMemberInit(MemberInitExpression init)
    338         {
    339             NewExpression newExpression = this.VisitNew(init.NewExpression);
    340             IEnumerable<MemberBinding> enumerable = this.VisitBindingList(init.Bindings);
    341             if (newExpression != init.NewExpression || enumerable != init.Bindings)
    342             {
    343                 return Expression.MemberInit(newExpression, enumerable);
    344             }
    345             return init;
    346         }
    347         protected virtual Expression VisitListInit(ListInitExpression init)
    348         {
    349             NewExpression newExpression = this.VisitNew(init.NewExpression);
    350             IEnumerable<ElementInit> enumerable = this.VisitElementInitializerList(init.Initializers);
    351             if (newExpression != init.NewExpression || enumerable != init.Initializers)
    352             {
    353                 return Expression.ListInit(newExpression, enumerable);
    354             }
    355             return init;
    356         }
    357         protected virtual Expression VisitNewArray(NewArrayExpression na)
    358         {
    359             IEnumerable<Expression> enumerable = this.VisitExpressionList(na.Expressions);
    360             if (enumerable == na.Expressions)
    361             {
    362                 return na;
    363             }
    364             if (na.NodeType == ExpressionType.NewArrayInit)
    365             {
    366                 return Expression.NewArrayInit(na.Type.GetElementType(), enumerable);
    367             }
    368             return Expression.NewArrayBounds(na.Type.GetElementType(), enumerable);
    369         }
    370         protected virtual Expression VisitInvocation(InvocationExpression iv)
    371         {
    372             IEnumerable<Expression> enumerable = this.VisitExpressionList(iv.Arguments);
    373             Expression expression = this.Visit(iv.Expression);
    374             if (enumerable != iv.Arguments || expression != iv.Expression)
    375             {
    376                 return Expression.Invoke(expression, enumerable);
    377             }
    378             return iv;
    379         }
    380     }
    381 }

     相关项目下载可以联系本人QQ;

    千人.NET交流群:18362376,因为有你,代码变得更简单,加群请输入cnblogs
  • 相关阅读:
    No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s).
    播放器 倒计时 闹钟 日期 分秒 时间算法
    iOS 8 以后获取地图坐标:
    数据存储(直接写入、NSUserDefaults、NSkeyedArchiver)
    图片处理 模糊效果
    手把手教你Windows下Go语言的环境搭建
    github 上传或删除 文件 命令
    域名解析-delphi 源码
    指针与引用
    指针
  • 原文地址:https://www.cnblogs.com/kingkoo/p/2478024.html
Copyright © 2011-2022 走看看