導航:首頁 > 凈水問答 > javawhere表達式過濾

javawhere表達式過濾

發布時間:2021-01-19 20:36:54

『壹』 如何將where條件的lambda表達式 轉成 sql where語句

public static class LambdaToSqlHelper
{

#region 基礎方法

#region 獲取條件語句方法

private static string GetWhereSql<T>(Expression<Func<T, bool>> func, List<ParMODEL> parModelList) where T : class
{
string res = "";
if (func.Body is BinaryExpression)
{
//起始參數

BinaryExpression be = ((BinaryExpression)func.Body);
res = BinarExpressionProvider(be.Left, be.Right, be.NodeType, parModelList);
}
else if (func.Body is MethodCallExpression)
{
MethodCallExpression be = ((MethodCallExpression)func.Body);
res = ExpressionRouter(func.Body, parModelList);
}
else
{
res = " ";
}

return res;
}

#endregion 獲取條件語句方法

#region 獲取排序語句 order by

private static string GetOrderSql<T>(Expression<Func<T, object>> exp) where T : class
{
var res = "";
if (exp.Body is UnaryExpression)
{
UnaryExpression ue = ((UnaryExpression)exp.Body);
List<ParMODEL> parModelList = new List<ParMODEL>();
res = "order by `" + ExpressionRouter(ue.Operand, parModelList).ToLower() + "`";
}
else
{
MemberExpression order = ((MemberExpression)exp.Body);
res = "order by `" + order.Member.Name.ToLower() + "`";
}
return res;
}

#endregion 獲取排序語句 order by

#endregion 基礎方法

#region 底層

public static bool In<T>(this T obj, T[] array)
{
return true;
}

public static bool NotIn<T>(this T obj, T[] array)
{
return true;
}

public static bool Like(this string str, string likeStr)
{
return true;
}

public static bool NotLike(this string str, string likeStr)
{
return true;
}

private static string GetValueStringByType(object oj)
{
if (oj == null)
{
return "null";
}
else if (oj is ValueType)
{
return oj.ToString();
}
else if (oj is string || oj is DateTime || oj is char)
{
return string.Format("'{0}'", oj.ToString());
}
else
{
return string.Format("'{0}'", oj.ToString());
}
}

private static string BinarExpressionProvider(Expression left, Expression right, ExpressionType type, List<ParMODEL> parModelList)
{
string sb = "(";
//先處理左邊
string reLeftStr = ExpressionRouter(left, parModelList);
sb += reLeftStr;

sb += ExpressionTypeCast(type);

//再處理右邊
string tmpStr = ExpressionRouter(right, parModelList);
if (tmpStr == "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";
}
}
else
{
//添加參數
sb += tmpStr;
}

return sb += ")";
}

private static string ExpressionRouter(Expression exp, List<ParMODEL> parModelList)
{
string sb = string.Empty;

if (exp is BinaryExpression)
{
BinaryExpression be = ((BinaryExpression)exp);
return BinarExpressionProvider(be.Left, be.Right, be.NodeType, parModelList);
}
else if (exp is MemberExpression)
{
MemberExpression me = ((MemberExpression)exp);
if (!exp.ToString().StartsWith("value"))
{
return me.Member.Name;
}
else
{
var result = Expression.Lambda(exp).Compile().DynamicInvoke();
if (result == null)
{
return "null";
}
else if (result is ValueType)
{
ParMODEL p = new ParMODEL();
p.name = "par" + (parModelList.Count + 1);
p.value = result.ToString().ToIntByStr();
parModelList.Add(p);
//return ce.Value.ToString();
return "@par" + parModelList.Count;
}
else if (result is string || result is DateTime || result is char)
{
ParMODEL p = new ParMODEL();
p.name = "par" + (parModelList.Count + 1);
p.value = result.ToString();
parModelList.Add(p);
//return string.Format("'{0}'", ce.Value.ToString());
return "@par" + parModelList.Count;
}
else if (result is int[])
{
var rl = result as int[];
StringBuilder sbIntStr = new StringBuilder();
foreach (var r in rl)
{
ParMODEL p = new ParMODEL();
p.name = "par" + (parModelList.Count + 1);
p.value = r.ToString().ToIntByStr();
parModelList.Add(p);
//return string.Format("'{0}'", ce.Value.ToString());
sbIntStr.Append("@par" + parModelList.Count + ",");
}
return sbIntStr.ToString().Substring(0, sbIntStr.ToString().Length - 1);
}
else if (result is string[])
{
var rl = result as string[];
StringBuilder sbIntStr = new StringBuilder();
foreach (var r in rl)
{
ParMODEL p = new ParMODEL();
p.name = "par" + (parModelList.Count + 1);
p.value = r.ToString();
parModelList.Add(p);
//return string.Format("'{0}'", ce.Value.ToString());
sbIntStr.Append("@par" + parModelList.Count + ",");
}
return sbIntStr.ToString().Substring(0, sbIntStr.ToString().Length - 1);
}
}
}
else if (exp is NewArrayExpression)
{
NewArrayExpression ae = ((NewArrayExpression)exp);
StringBuilder tmpstr = new StringBuilder();
foreach (Expression ex in ae.Expressions)
{
tmpstr.Append(ExpressionRouter(ex, parModelList));
tmpstr.Append(",");
}
//添加參數

return tmpstr.ToString(0, tmpstr.Length - 1);
}
else if (exp is MethodCallExpression)
{
MethodCallExpression mce = (MethodCallExpression)exp;
string par = ExpressionRouter(mce.Arguments[0], parModelList);
if (mce.Method.Name == "Like")
{
//添加參數用
return string.Format("({0} like {1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
}
else if (mce.Method.Name == "NotLike")
{
//添加參數用
return string.Format("({0} Not like {1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
}
else if (mce.Method.Name == "In")
{
//添加參數用
return string.Format("{0} In ({1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
}
else if (mce.Method.Name == "NotIn")
{
//添加參數用
return string.Format("{0} Not In ({1})", par, ExpressionRouter(mce.Arguments[1], parModelList));
}
}
else if (exp is ConstantExpression)
{
ConstantExpression ce = ((ConstantExpression)exp);
if (ce.Value == null)
{
return "null";
}
else if (ce.Value is ValueType)
{
ParMODEL p = new ParMODEL();
p.name = "par" + (parModelList.Count + 1);
p.value = ce.Value.ToString().ToIntByStr();
parModelList.Add(p);
//return ce.Value.ToString();
return "@par" + parModelList.Count;
}
else if (ce.Value is string || ce.Value is DateTime || ce.Value is char)
{
ParMODEL p = new ParMODEL();
p.name = "par" + (parModelList.Count + 1);
p.value = ce.Value.ToString();
parModelList.Add(p);
//return string.Format("'{0}'", ce.Value.ToString());
return "@par" + parModelList.Count;
}

閱讀全文

與javawhere表達式過濾相關的資料

熱點內容
凈水機顯示紅燈是什麼意思 瀏覽:48
大眾magotan空調濾芯在哪裡 瀏覽:822
上海優良濾芯要多少錢 瀏覽:373
魔獸世界語言過濾器是灰色的 瀏覽:993
污水可以用石灰和什麼處理 瀏覽:399
道爾頓凈水器水量變小是什麼問題 瀏覽:766
工業污水生物除臭哪家好 瀏覽:511
工地污水處理設備要多少錢 瀏覽:675
用蒸餾水敷臉臉上會脫皮嗎 瀏覽:849
汽車濾芯器起什麼作用 瀏覽:59
香精油蒸餾提取 瀏覽:825
葡萄蒸餾酒怎麼吃法 瀏覽:160
愛瑪特沁園凈水器哪個好 瀏覽:621
dataframe過濾空值 瀏覽:859
娃哈哈用什麼凈水機 瀏覽:302
物品過濾說明poe 瀏覽:595
校園凈水器型號如何選擇 瀏覽:45
家用為什麼飲水機只能用1年 瀏覽:76
超濾膜能不能過濾黃泥水 瀏覽:582
鍋底的水垢如何處理 瀏覽:924