/// <要約> ///表达式转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。 } }