SQLへの(.NET Frameworkの)ラムダ式

   /// <要約> 
   ///表达式转SQL帮助类
   /// </要約> 
   パブリック静的クラスLambdaToSqlHelper 
   { 
       
       /// <要約> 
       ///从表达式获取SQL 
       /// </要約> 
       // / <typeparam名= "T"> </ typeparam> 
       /// <PARAM NAME = "FUNC"> </ PARAM> 
       /// <戻る> </戻り> 
       パブリック静的文字列GetSqlFromExpression <T>(式<のFunc < T、BOOL >> FUNC)
       { 
           IF(FUNC = NULL && func.BodyあるBinaryExpressionをすること)!
           { 
               BinarExpressionProvider(be.Left、be.Right、be.NodeType)を返します。
           } 
           そう 
           {
               リターン"(= 1)";
           } 
       } 
 
       /// <要約> 
       ///拆分、拼接SQL 
       /// </要約> 
       /// <PARAM NAME = "左"> </ PARAM> 
       /// <PARAM NAME = "右"> < / PARAM> 
       /// <PARAM NAME = "タイプ"> </ PARAM> 
       /// <戻る> </戻り> 
       スタティックストリングBinarExpressionProvider(式が左、式右、ExpressionType型)
       { 
           文字列SB = "("; 
           SB + = ExpressionRouter(左); 
           SB + = ExpressionTypeCast(タイプ); 
           ストリングtmpStr = ExpressionRouter(右)。
               IF(sb.EndsWith( "= "))SB = sb.Substring(0、sb.Length - 2)+"がnullです"。
               (sb.EndsWith( "<>"))SB = sb.Substring(0、sb.Length - 2)他の場合は+ "ヌルではありません"。
           } 
           他SB + = tmpStr。
           リターンSB + = ")"; 
       } 
 
       /// <要約> 
       ///拆分、拼接SQL 
       /// </要約> 
       /// <PARAM NAME = "EXP"> </ PARAM> 
       /// <戻る> </戻り> 
       静的文字列ExpressionRouter (式exp)
       { 
           文字列SB = String.Emptyを。
           } 
           他の場合には(EXPはMemberExpression私です)
           {  
               me.Member.Nameを返します。
           }
           他(expがNewArrayExpression AEである)場合
           、{ 
               StringBuilderのtmpstr =新規のStringBuilder(); 
               foreachの(ae.Expressionsにおける発現のex)
               { 
                   tmpstr.Append(ExpressionRouter(EX))。
                   tmpstr.Append( ""); 
               } 
               tmpstr.ToString(0、tmpstr.Length - 1)を返します。
           } 
           他(expはMethodCallExpressionのMCEである)場合
           、{ 
               VAR attributeData = mce.Method.GetCustomAttributes(typeof演算(ToSqlFormat)、false)を1次回(); 
               戻りString.Formatの(((ToSqlFormat)attributeData).Format、ExpressionRouter(mce.Arguments [0])、ExpressionRouter(mce.Arguments [1]))。
           } 
           それ以外の場合は、(expがConstantExpressionのCEです) 
           、{ 
               もし(ce.Value == NULL)
                   リターン"NULL"; 
               それ以外の場合(ce.ValueはValueTypeにある)
                   リターンce.Value.ToString(); 
               他の場合(ce.Valueが文字列である|| ce.Valueは日時|| ce.Valueがcharである)
                   戻りString.Formatの( " '{0}'"、ce.Value.ToString())。
           } 
           他(expがUnaryExpressionある)なら
           、{ 
               UnaryExpression UE =((UnaryExpression)式)。
               リターンExpressionRouter(ue.Operand)。
           } 
 
           はnullを返します。
       } 
  
       /// <概要> 
       ノードタイプノード///記載の変換式ツリーであるAキーワードSQL 
       /// </要約> 
       /// <PARAM NAME = "タイプ "> </ param>の
       /// <戻る> </戻り> 
       スタティックストリングExpressionTypeCast(ExpressionType型)
       { 
           スイッチ(タイプ)
           { 
               ケースExpressionType.And:
                   リターン"&"。
               ケースExpressionType.AndAlso:
                   リターン"AND"; 
               ケースExpressionType.Equal:
                   リターン"="; 
               ケースExpressionType.GreaterThan:
                   リターン">"; 
               ケースExpressionType.GreaterThanOrEqual:
                   「> =」を返します。
               ケースExpressionType.LessThan: 
                   リターン"<";
                   リターン"<="; 
               ケースExpressionType.NotEqual:
                   リターン"<>"; 
               ケースExpressionType.Or:
                   リターン"|"; 
               ケースExpressionType.OrElse:
                   リターン「または」; 
               ケースExpressionType.Add:
               ケースはExpressionType.AddChecked:
                   リターンを"+"。
               ケースExpressionType.Subtract:
               ケースはExpressionType.SubtractChecked:
                   リターンを" - ";
                   「/」を返します。
               ケースExpressionType.Multiply:
                   「*」を返します。
               デフォルト:
                   リターンはnull; 
           } 
       } 
 
       [ToSqlFormat( "{0} IN({1})")] 
       パブリック静的ブール値<T>(このT OBJ、T []配列)で
       { 
           trueを返します。
       } 
       [ToSqlFormat( "{0} NOT IN({1})")] 
       パブリック静的ブールNotIn <T>(このT OBJ、T []配列)
       { 
           trueを返します。
       } 
       [ToSqlFormat( "{0} LIKE {1}")] 
       枚(この文字列str、ストリングlikeStr)BOOLパブリック静的
       { 
           trueを返します。
       [ToSqlFormat( "{0} NOT LIKE {1}")]
       NotLike BOOLパブリック静的(この文字列str、ストリングlikeStrは)
       { 
           trueを返します。
       } 
 
   } 
 
   publicクラスのToSqlFormat:属性
   { 
       公共の文字列の書式を{取得します。セット; } 
       公共ToSqlFormat(文字列str)
       { 
           形式= STR。
       } 
 
   }

 


 

おすすめ

転載: www.cnblogs.com/qiulidong/p/11956064.html