using System; using System.Linq; using System.Linq.Expressions; namespace Common.LambdaToSQL { internal enum LambdaExpUnion : byte { And, Or, OrderBy } /// /// Lambda转SQL语句 /// /// 查询类 public sealed class LambdaExpConditions { #region 外部访问方法 /// /// 获取 Where 条件语句 /// /// 是否加Where词 /// Where条件语句 public string Where(bool addCinditionKey = true) { if (string.IsNullOrWhiteSpace(_aiWhereStr)) return string.Empty; //(1 And (( (Category = 1) And (DeleteMark = 0)) And (EnabledMark = 1))) //((1 And (CategoryId = 1)) And ((OperateTime >= '2018/5/6 0:00:00') And (OperateTime <= '2018/5/14 0:00:00'))) //处理语句开头有bool值情况 string temp = _aiWhereStr; temp = temp.Replace("(", "").Replace(")", "").Trim(); if (temp.StartsWith("1 And")) { _aiWhereStr = _aiWhereStr.Replace("1 And", ""); } else if (temp.StartsWith("0 And")) { _aiWhereStr = _aiWhereStr.Replace("0 And", ""); } if (addCinditionKey) { return " Where " + _aiWhereStr; } else { return _aiWhereStr; } } /// /// 获取 OrderBy 条件语句 /// /// 是否加Order By词 /// OrderBy 条件语句 public string OrderBy(bool addCinditionKey = true) { if (string.IsNullOrWhiteSpace(_aiOrderByStr)) return string.Empty; if (addCinditionKey) { return " Order By " + _aiOrderByStr; } else { return _aiOrderByStr; } } #endregion 外部访问方法 #region 混合语句增加操作 /// /// 添加一个条件语句(Where/OrderBy) /// /// 条件表达示 public void Add(Expression, IQueryable>> aiExp) { SetConditionStr(aiExp, LambdaExpUnion.And); } /// /// 当给定条件满足时,添加一个条件语句(Where/OrderBy) /// /// 当给定条件满足时 /// 条件表达示 public void Add(bool aiCondition, Expression, IQueryable>> aiExp) { if (aiCondition) { SetConditionStr(aiExp, LambdaExpUnion.And); } } /// /// 当给定lambda表达式条件满足时,添加一个条件语句(Where/OrderBy) /// /// 给定lambda表达式条件 /// 条件表达示 public void Add(Func aiCondition, Expression, IQueryable>> aiExp) { Add(aiCondition(), aiExp); } /// /// 如果条件满足时,将添加前一个条件语句(Where/OrderBy),否则添加后一个 /// /// 条件 /// 条件为真时 /// 条件为假时 public void Add(bool aiCondition, Expression, IQueryable>> aiExpWhenTrue, Expression, IQueryable>> aiExpWhenFalse) { if (aiCondition) { SetConditionStr(aiExpWhenTrue, LambdaExpUnion.And); } else { SetConditionStr(aiExpWhenFalse, LambdaExpUnion.And); } } /// /// 如果条件满足时,将添加前一个条件语句(Where/OrderBy),否则添加后一个 /// /// 条件 /// 条件为真时 /// 条件为假时 public void Add(Func aiCondition, Expression, IQueryable>> aiExpWhenTrue, Expression, IQueryable>> aiExpWhenFalse) { Add(aiCondition(), aiExpWhenTrue, aiExpWhenFalse); } #endregion 混合语句增加操作 #region 以 And 相联接 Where条件语句 /// /// 添加一个Where条件语句,如果语句存在,则以 And 相联接 /// /// Where条件表达示 public void AddAndWhere(Expression> aiExp) { SetOneConditionStr(aiExp, LambdaExpUnion.And); } /// /// 当给定条件满足时,添加一个Where条件语句,如果语句存在,则以 And 相联接 /// /// 给定条件 /// Where条件表达示 public void AddAndWhere(bool aiCondition, Expression> aiExp) { if (aiCondition) { SetOneConditionStr(aiExp, LambdaExpUnion.And); } } /// /// 当给定lambda表达式条件满足时,添加一个Where条件语句,如果语句存在,则以 And 相联接 /// /// 给定lambda表达式条件 /// public void AddAndWhere(Func aiCondition, Expression> aiExp) { AddAndWhere(aiCondition(), aiExp); } /// /// 如果条件满足时,将添加前一个条件语句(Where),否则添加后一个,以 And 相联接 /// /// 条件 /// 条件为真时 /// 条件为假时 public void AddAndWhere(bool aiCondition, Expression> aiExpWhenTrue, Expression> aiExpWhenFalse) { if (aiCondition) { SetOneConditionStr(aiExpWhenTrue, LambdaExpUnion.And); } else { SetOneConditionStr(aiExpWhenFalse, LambdaExpUnion.And); } } /// /// 如果条件满足时,将添加前一个条件语句(Where),否则添加后一个,以 And 相联接 /// /// Lambda条件 /// 条件为真时 /// 条件为假时 public void AddAndWhere(Func aiCondition, Expression> aiExpWhenTrue, Expression> aiExpWhenFalse) { AddAndWhere(aiCondition(), aiExpWhenTrue, aiExpWhenFalse); } #endregion 以 And 相联接 Where条件语句 #region 以 Or 相联接 Where条件语句 /// /// 添加一个Where条件语句,如果语句存在,则以 Or 相联接 /// /// Where条件表达示 public void AddOrWhere(Expression> aiExp) { SetOneConditionStr(aiExp, LambdaExpUnion.Or); } /// /// 当给定条件满足时,添加一个Where条件语句,如果语句存在,则以 Or 相联接 /// /// 给定条件 /// Where条件表达示 public void AddOrWhere(bool aiCondition, Expression> aiExp) { if (aiCondition) { SetOneConditionStr(aiExp, LambdaExpUnion.Or); } } /// /// 当给定lambda表达式条件满足时,添加一个Where条件语句,如果语句存在,则以 Or 相联接 /// /// 给定lambda表达式条件 /// public void AddOrWhere(Func aiCondition, Expression> aiExp) { AddOrWhere(aiCondition(), aiExp); } /// /// 如果条件满足时,将添加前一个条件语句(Where),否则添加后一个,以 Or 相联接 /// /// 条件 /// 条件为真时 /// 条件为假时 public void AddOrWhere(bool aiCondition, Expression> aiExpWhenTrue, Expression> aiExpWhenFalse) { if (aiCondition) { SetOneConditionStr(aiExpWhenTrue, LambdaExpUnion.Or); } else { SetOneConditionStr(aiExpWhenFalse, LambdaExpUnion.Or); } } /// /// 如果条件满足时,将添加前一个条件语句(Where),否则添加后一个,以 Or 相联接 /// /// Lambda条件 /// 条件为真时 /// 条件为假时 public void AddOrWhere(Func aiCondition, Expression> aiExpWhenTrue, Expression> aiExpWhenFalse) { AddOrWhere(aiCondition(), aiExpWhenTrue, aiExpWhenFalse); } #endregion 以 Or 相联接 Where条件语句 #region OrderBy语句 /// /// 添加一个OrderBy语句 /// /// OrderBy的字段数据类型 /// OrderBy条件表达示 public void AddOrderBy(Expression> aiExp) { SetOneConditionStr(aiExp, LambdaExpUnion.OrderBy); } /// /// 如果条件满足时,添加一个OrderBy语句 /// /// OrderBy的字段数据类型 /// 条件 /// OrderBy条件表达示 public void AddOrderBy(bool aiCondition, Expression> aiExp) { if (aiCondition) { SetOneConditionStr(aiExp, LambdaExpUnion.OrderBy); } } /// /// 如果条件满足时,添加一个OrderBy语句 /// /// OrderBy的数据字段类型 /// Lambda条件 /// OrderBy条件表达示 public void AddOrderBy(Func aiCondition, Expression> aiExp) { AddOrderBy(aiCondition(), aiExp); } /// /// 如果条件满足时,将添加前一个OrderBy语句,否则添加后一个 /// /// OrderBy的数据字段类型 /// 条件 /// 条件为真时 /// 条件为假时 public void AddOrderBy(bool aiCondition, Expression> aiExpWhenTrue, Expression> aiExpWhenFalse) { if (aiCondition) { SetOneConditionStr(aiExpWhenTrue, LambdaExpUnion.OrderBy); } else { SetOneConditionStr(aiExpWhenFalse, LambdaExpUnion.OrderBy); } } /// /// 如果条件满足时,将添加前一个OrderBy语句,否则添加后一个 /// /// OrderBy的数据字段类型 /// Lambda条件 /// 条件为真时 /// 条件为假时 public void AddOrderBy(Func aiCondition, Expression> aiExpWhenTrue, Expression> aiExpWhenFalse) { AddOrderBy(aiCondition(), aiExpWhenTrue, aiExpWhenFalse); } #endregion OrderBy语句 #region 内部操作 /// /// Where语句 /// private string _aiWhereStr = string.Empty; /// /// OrderBy语句 /// private string _aiOrderByStr = string.Empty; private void SetConditionStr(Expression aiExp, LambdaExpUnion lambdaUion = LambdaExpUnion.And) { SetWhere(aiExp);//Where条件句 SetOrderBy(aiExp);//Order by 语句 } private void SetOneConditionStr(Expression aiExp, LambdaExpUnion bizUion = LambdaExpUnion.And) { if ((bizUion == LambdaExpUnion.And) || (bizUion == LambdaExpUnion.Or)) { SetWhere(aiExp);//Where条件句 } else if (bizUion == LambdaExpUnion.OrderBy) { SetOrderBy(aiExp);//Order by 语句 } } private void SetOrderBy(Expression aiExp) { var itemstr = ExpressionWriterSql.BizWhereWriteToString(aiExp, SqlType.Order); if (string.IsNullOrWhiteSpace(_aiOrderByStr)) { _aiOrderByStr = itemstr; } else { _aiOrderByStr = _aiOrderByStr + "," + itemstr; } } private void SetWhere(Expression aiExp, LambdaExpUnion bizUion = LambdaExpUnion.And) { var itemstr = ExpressionWriterSql.BizWhereWriteToString(aiExp, SqlType.Where); if (string.IsNullOrWhiteSpace(_aiWhereStr)) { _aiWhereStr = itemstr; } else { if (bizUion == LambdaExpUnion.Or) { _aiWhereStr = _aiWhereStr + " Or " + itemstr; } else { _aiWhereStr = _aiWhereStr + " And " + itemstr; } } } #endregion 内部操作 } }