日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lamber表达式sql_lambda表达式转换sql

發布時間:2024/9/27 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lamber表达式sql_lambda表达式转换sql 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Linq;usingSystem.Linq.Expressions;usingSystem.Text;usingSystem.Threading.Tasks;namespaceMaiCore

{///

///

///

public classLambdaToSqlHelper

{///

///NodeType枚舉///

private enumEnumNodeType

{///

///二元運算符///

[Description("二元運算符")]

BinaryOperator= 1,///

///一元運算符///

[Description("一元運算符")]

UndryOperator= 2,///

///常量表達式///

[Description("常量表達式")]

Constant= 3,///

///成員(變量)///

[Description("成員(變量)")]

MemberAccess= 4,///

///函數///

[Description("函數")]

Call= 5,///

///未知///

[Description("未知")]

Unknown= -99,///

///不支持///

[Description("不支持")]

NotSupported= -98}///

///判斷表達式類型///

/// lambda表達式

///

private staticEnumNodeType CheckExpressionType(Expression exp)

{switch(exp.NodeType)

{caseExpressionType.AndAlso:caseExpressionType.OrElse:caseExpressionType.Equal:caseExpressionType.GreaterThanOrEqual:caseExpressionType.LessThanOrEqual:caseExpressionType.GreaterThan:caseExpressionType.LessThan:caseExpressionType.NotEqual:returnEnumNodeType.BinaryOperator;caseExpressionType.Constant:returnEnumNodeType.Constant;caseExpressionType.MemberAccess:returnEnumNodeType.MemberAccess;caseExpressionType.Call:returnEnumNodeType.Call;caseExpressionType.Not:caseExpressionType.Convert:returnEnumNodeType.UndryOperator;default:returnEnumNodeType.Unknown;

}

}///

///表達式類型轉換///

///

///

private static stringExpressionTypeCast(ExpressionType type)

{switch(type)

{caseExpressionType.And:caseExpressionType.AndAlso:return "and";caseExpressionType.Equal:return "=";caseExpressionType.GreaterThan:return ">";caseExpressionType.GreaterThanOrEqual:return ">=";caseExpressionType.LessThan:return "";caseExpressionType.Or:caseExpressionType.OrElse:return "or";caseExpressionType.Add:caseExpressionType.AddChecked:return "+";caseExpressionType.Subtract:caseExpressionType.SubtractChecked:return "-";caseExpressionType.Divide:return "/";caseExpressionType.Multiply:caseExpressionType.MultiplyChecked:return "*";default:return null;

}

}private static string BinarExpressionProvider(Expression exp, ListlistSqlParaModel)

{

BinaryExpression be= exp asBinaryExpression;

Expression left=be.Left;

Expression right=be.Right;

ExpressionType type=be.NodeType;string sb = "(";//先處理左邊

sb +=ExpressionRouter(left, listSqlParaModel);

sb+=ExpressionTypeCast(type);//再處理右邊

string sbTmp =ExpressionRouter(right, listSqlParaModel);if (sbTmp == "null")

{if (sb.EndsWith("="))

sb= sb.Substring(0, sb.Length - 2) + "is null";else if (sb.EndsWith("<>"))

sb= sb.Substring(0, sb.Length - 2) + "is not null";

}elsesb+=sbTmp;return sb += ")";

}private static string ConstantExpressionProvider(Expression exp, ListlistSqlParaModel)

{

ConstantExpression ce= exp asConstantExpression;if (ce.Value == null)

{return "null";

}else if (ce.Value isValueType)

{

GetSqlParaModel(listSqlParaModel, GetValueType(ce.Value));return "@para" +listSqlParaModel.Count;

}else if (ce.Value is string || ce.Value is DateTime || ce.Value is char)

{

GetSqlParaModel(listSqlParaModel, GetValueType(ce.Value));return "@para" +listSqlParaModel.Count;

}return "";

}private static string LambdaExpressionProvider(Expression exp, ListlistSqlParaModel)

{

LambdaExpression le= exp asLambdaExpression;returnExpressionRouter(le.Body, listSqlParaModel);

}private static string MemberExpressionProvider(Expression exp, ListlistSqlParaModel)

{if (!exp.ToString().StartsWith("value"))

{

MemberExpression me= exp asMemberExpression;if (me.Member.Name == "Now")

{

GetSqlParaModel(listSqlParaModel, DateTime.Now);return "@para" +listSqlParaModel.Count;

}returnme.Member.Name;

}else{var result =Expression.Lambda(exp).Compile().DynamicInvoke();if (result == null)

{return "null";

}else if (result isValueType)

{

GetSqlParaModel(listSqlParaModel, GetValueType(result));return "@para" +listSqlParaModel.Count;

}else if (result is string || result is DateTime || result is char)

{

GetSqlParaModel(listSqlParaModel, GetValueType(result));return "@para" +listSqlParaModel.Count;

}else if (result is int[])

{var rl = result as int[];

StringBuilder sbTmp= newStringBuilder();foreach (var r inrl)

{

GetSqlParaModel(listSqlParaModel, r.ToString().ToInt32());

sbTmp.Append("@para" + listSqlParaModel.Count + ",");

}return sbTmp.ToString().Substring(0, sbTmp.ToString().Length - 1);

}else if (result is string[])

{var rl = result as string[];

StringBuilder sbTmp= newStringBuilder();foreach (var r inrl)

{

GetSqlParaModel(listSqlParaModel, r.ToString());

sbTmp.Append("@para" + listSqlParaModel.Count + ",");

}return sbTmp.ToString().Substring(0, sbTmp.ToString().Length - 1);

}

}return "";

}private static string MethodCallExpressionProvider(Expression exp, ListlistSqlParaModel)

{

MethodCallExpression mce= exp asMethodCallExpression;if (mce.Method.Name == "Contains")

{if (mce.Object == null)

{return string.Format("{0} in ({1})", ExpressionRouter(mce.Arguments[1], listSqlParaModel), ExpressionRouter(mce.Arguments[0], listSqlParaModel));

}else{if (mce.Object.NodeType ==ExpressionType.MemberAccess)

{//w => w.name.Contains("1")

var _name =ExpressionRouter(mce.Object, listSqlParaModel);var _value = ExpressionRouter(mce.Arguments[0], listSqlParaModel);var index = _value.RetainNumber().ToInt32() - 1;

listSqlParaModel[index].value= "%{0}%".FormatWith(listSqlParaModel[index].value);return string.Format("{0} like {1}", _name, _value);

}

}

}else if (mce.Method.Name == "OrderBy")

{return string.Format("{0} asc", ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}else if (mce.Method.Name == "OrderByDescending")

{return string.Format("{0} desc", ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}else if (mce.Method.Name == "ThenBy")

{return string.Format("{0},{1} asc", MethodCallExpressionProvider(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}else if (mce.Method.Name == "ThenByDescending")

{return string.Format("{0},{1} desc", MethodCallExpressionProvider(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}else if (mce.Method.Name == "Like")

{return string.Format("({0} like {1})", ExpressionRouter(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel).Replace("'", ""));

}else if (mce.Method.Name == "NotLike")

{return string.Format("({0} not like '%{1}%')", ExpressionRouter(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel).Replace("'", ""));

}else if (mce.Method.Name == "In")

{return string.Format("{0} in ({1})", ExpressionRouter(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}else if (mce.Method.Name == "NotIn")

{return string.Format("{0} not in ({1})", ExpressionRouter(mce.Arguments[0], listSqlParaModel), ExpressionRouter(mce.Arguments[1], listSqlParaModel));

}return "";

}private static string NewArrayExpressionProvider(Expression exp, ListlistSqlParaModel)

{

NewArrayExpression ae= exp asNewArrayExpression;

StringBuilder sbTmp= newStringBuilder();foreach (Expression ex inae.Expressions)

{

sbTmp.Append(ExpressionRouter(ex, listSqlParaModel));

sbTmp.Append(",");

}return sbTmp.ToString(0, sbTmp.Length - 1);

}private static string ParameterExpressionProvider(Expression exp, ListlistSqlParaModel)

{

ParameterExpression pe= exp asParameterExpression;returnpe.Type.Name;

}private static string UnaryExpressionProvider(Expression exp, ListlistSqlParaModel)

{

UnaryExpression ue= exp asUnaryExpression;var result =ExpressionRouter(ue.Operand, listSqlParaModel);

ExpressionType type=exp.NodeType;if (type ==ExpressionType.Not)

{if (result.Contains("in"))

{

result= result.Replace("in", "not in");

}if (result.Contains("like"))

{

result= result.Replace("like", "not like");

}

}returnresult;

}///

///路由計算///

///

///

///

private static string ExpressionRouter(Expression exp, ListlistSqlParaModel)

{var nodeType =exp.NodeType;if (exp is BinaryExpression) //表示具有二進制運算符的表達式

{returnBinarExpressionProvider(exp, listSqlParaModel);

}else if (exp is ConstantExpression) //表示具有常數值的表達式

{returnConstantExpressionProvider(exp, listSqlParaModel);

}else if (exp is LambdaExpression) //介紹 lambda 表達式。 它捕獲一個類似于 .NET 方法主體的代碼塊

{returnLambdaExpressionProvider(exp, listSqlParaModel);

}else if (exp is MemberExpression) //表示訪問字段或屬性

{returnMemberExpressionProvider(exp, listSqlParaModel);

}else if (exp is MethodCallExpression) //表示對靜態方法或實例方法的調用

{returnMethodCallExpressionProvider(exp, listSqlParaModel);

}else if (exp is NewArrayExpression) //表示創建一個新數組,并可能初始化該新數組的元素

{returnNewArrayExpressionProvider(exp, listSqlParaModel);

}else if (exp is ParameterExpression) //表示一個命名的參數表達式。

{returnParameterExpressionProvider(exp, listSqlParaModel);

}else if (exp is UnaryExpression) //表示具有一元運算符的表達式

{returnUnaryExpressionProvider(exp, listSqlParaModel);

}return null;

}///

///值類型轉換///

///

///

private static object GetValueType(object_value)

{var _type =_value.GetType().Name;switch(_type)

{case "Decimal": return_value.ToDecimal();case "Int32": return_value.ToInt32();case "DateTime": return_value.ToDateTime();case "String": return_value.ToString();case "Char":return_value.ToChar();case "Boolean":return_value.ToBoolean();default: return_value;

}

}///

///sql參數///

///

///

private static void GetSqlParaModel(List listSqlParaModel, objectval)

{

SqlParaModel p= newSqlParaModel();

p.name= "para" + (listSqlParaModel.Count + 1);

p.value=val;

listSqlParaModel.Add(p);

}///

///lambda表達式轉換sql///

///

///

///

///

public static string GetWhereSql(Expression> where, List listSqlParaModel) where T : class{string result = string.Empty;if (where != null)

{

Expression exp= where.Body asExpression;

result=ExpressionRouter(exp, listSqlParaModel);

}if (result != string.Empty)

{

result= "where" +result;

}returnresult;

}///

///lambda表達式轉換sql///

///

///

///

public static string GetOrderBySql(Expression, IOrderedQueryable>> orderBy) where T : class{string result = string.Empty;if (orderBy != null && orderBy.Body isMethodCallExpression)

{

MethodCallExpression exp= orderBy.Body asMethodCallExpression;

List listSqlParaModel = new List();

result=MethodCallExpressionProvider(exp, listSqlParaModel);

}if (result != string.Empty)

{

result= "order by" +result;

}returnresult;

}///

///lambda表達式轉換sql///

///

///

///

public static string GetQueryField(Expression>fields)

{

StringBuilder sbSelectFields= newStringBuilder();if (fields.Body isNewExpression)

{

NewExpression ne= fields.Body asNewExpression;for (var i = 0; i < ne.Members.Count; i++)

{

sbSelectFields.Append(ne.Members[i].Name+ ",");

}

}else if (fields.Body isParameterExpression)

{

sbSelectFields.Append("*");

}else{

sbSelectFields.Append("*");

}if (sbSelectFields.Length > 1)

{

sbSelectFields= sbSelectFields.Remove(sbSelectFields.Length - 1, 1);

}returnsbSelectFields.ToString();

}

}

}-----------------------------------------------------------------------------------------------demo:classProgram

{static void Main(string[] args)

{//Expression> where = w => w.id == "123456";

Expression> where = w => w.id.Contains("1");

List listSqlParaModel = new List();var sql = LambdaToSqlHelper.GetWhereSql(where, listSqlParaModel);

}

}classMyClass

{public stringid;public stringname;public stringdesc;public decimalprice;public intstock;public boolisShow;publicDateTime createTime;

}

總結

以上是生活随笔為你收集整理的lamber表达式sql_lambda表达式转换sql的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。