123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409 |
- using System;
- using System.Linq;
- using System.Linq.Expressions;
- namespace Common.LambdaToSQL
- {
- internal enum LambdaExpUnion : byte
- {
- And,
- Or,
- OrderBy
- }
- /// <summary>
- /// Lambda转SQL语句
- /// </summary>
- /// <typeparam name="T">查询类</typeparam>
- public sealed class LambdaExpConditions<T>
- {
- #region 外部访问方法
- /// <summary>
- /// 获取 Where 条件语句
- /// </summary>
- /// <param name="addCinditionKey">是否加Where词</param>
- /// <returns>Where条件语句</returns>
- 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;
- }
- }
- /// <summary>
- /// 获取 OrderBy 条件语句
- /// </summary>
- /// <param name="addCinditionKey">是否加Order By词</param>
- /// <returns>OrderBy 条件语句</returns>
- public string OrderBy(bool addCinditionKey = true)
- {
- if (string.IsNullOrWhiteSpace(_aiOrderByStr)) return string.Empty;
- if (addCinditionKey)
- {
- return " Order By " + _aiOrderByStr;
- }
- else
- {
- return _aiOrderByStr;
- }
- }
- #endregion 外部访问方法
- #region 混合语句增加操作
- /// <summary>
- /// 添加一个条件语句(Where/OrderBy)
- /// </summary>
- /// <param name="aiExp">条件表达示</param>
- public void Add(Expression<Func<IQueryable<T>, IQueryable<T>>> aiExp)
- {
- SetConditionStr(aiExp, LambdaExpUnion.And);
- }
- /// <summary>
- /// 当给定条件满足时,添加一个条件语句(Where/OrderBy)
- /// </summary>
- /// <param name="aiCondition">当给定条件满足时</param>
- /// <param name="aiExp">条件表达示</param>
- public void Add(bool aiCondition, Expression<Func<IQueryable<T>, IQueryable<T>>> aiExp)
- {
- if (aiCondition)
- {
- SetConditionStr(aiExp, LambdaExpUnion.And);
- }
- }
- /// <summary>
- /// 当给定lambda表达式条件满足时,添加一个条件语句(Where/OrderBy)
- /// </summary>
- /// <param name="aiCondition">给定lambda表达式条件</param>
- /// <param name="aiExp">条件表达示</param>
- public void Add(Func<bool> aiCondition, Expression<Func<IQueryable<T>, IQueryable<T>>> aiExp)
- {
- Add(aiCondition(), aiExp);
- }
- /// <summary>
- /// 如果条件满足时,将添加前一个条件语句(Where/OrderBy),否则添加后一个
- /// </summary>
- /// <param name="aiCondition">条件</param>
- /// <param name="aiExpWhenTrue">条件为真时</param>
- /// <param name="aiExpWhenFalse">条件为假时</param>
- public void Add(bool aiCondition, Expression<Func<IQueryable<T>, IQueryable<T>>> aiExpWhenTrue, Expression<Func<IQueryable<T>, IQueryable<T>>> aiExpWhenFalse)
- {
- if (aiCondition)
- {
- SetConditionStr(aiExpWhenTrue, LambdaExpUnion.And);
- }
- else
- {
- SetConditionStr(aiExpWhenFalse, LambdaExpUnion.And);
- }
- }
- /// <summary>
- /// 如果条件满足时,将添加前一个条件语句(Where/OrderBy),否则添加后一个
- /// </summary>
- /// <param name="aiCondition">条件</param>
- /// <param name="aiExpWhenTrue">条件为真时</param>
- /// <param name="aiExpWhenFalse">条件为假时</param>
- public void Add(Func<bool> aiCondition, Expression<Func<IQueryable<T>, IQueryable<T>>> aiExpWhenTrue, Expression<Func<IQueryable<T>, IQueryable<T>>> aiExpWhenFalse)
- {
- Add(aiCondition(), aiExpWhenTrue, aiExpWhenFalse);
- }
- #endregion 混合语句增加操作
- #region 以 And 相联接 Where条件语句
- /// <summary>
- /// 添加一个Where条件语句,如果语句存在,则以 And 相联接
- /// </summary>
- /// <param name="aiExp">Where条件表达示</param>
- public void AddAndWhere(Expression<Func<T, bool>> aiExp)
- {
- SetOneConditionStr(aiExp, LambdaExpUnion.And);
- }
-
- /// <summary>
- /// 当给定条件满足时,添加一个Where条件语句,如果语句存在,则以 And 相联接
- /// </summary>
- /// <param name="aiCondition">给定条件</param>
- /// <param name="aiExp">Where条件表达示</param>
- public void AddAndWhere(bool aiCondition, Expression<Func<T, bool>> aiExp)
- {
- if (aiCondition)
- {
- SetOneConditionStr(aiExp, LambdaExpUnion.And);
- }
- }
- /// <summary>
- /// 当给定lambda表达式条件满足时,添加一个Where条件语句,如果语句存在,则以 And 相联接
- /// </summary>
- /// <param name="aiCondition">给定lambda表达式条件</param>
- /// <param name="aiExp"></param>
- public void AddAndWhere(Func<bool> aiCondition, Expression<Func<T, bool>> aiExp)
- {
- AddAndWhere(aiCondition(), aiExp);
- }
- /// <summary>
- /// 如果条件满足时,将添加前一个条件语句(Where),否则添加后一个,以 And 相联接
- /// </summary>
- /// <param name="aiCondition">条件</param>
- /// <param name="aiExpWhenTrue">条件为真时</param>
- /// <param name="aiExpWhenFalse">条件为假时</param>
- public void AddAndWhere(bool aiCondition, Expression<Func<T, bool>> aiExpWhenTrue, Expression<Func<T, bool>> aiExpWhenFalse)
- {
- if (aiCondition)
- {
- SetOneConditionStr(aiExpWhenTrue, LambdaExpUnion.And);
- }
- else
- {
- SetOneConditionStr(aiExpWhenFalse, LambdaExpUnion.And);
- }
- }
- /// <summary>
- /// 如果条件满足时,将添加前一个条件语句(Where),否则添加后一个,以 And 相联接
- /// </summary>
- /// <param name="aiCondition">Lambda条件</param>
- /// <param name="aiExpWhenTrue">条件为真时</param>
- /// <param name="aiExpWhenFalse">条件为假时</param>
- public void AddAndWhere(Func<bool> aiCondition, Expression<Func<T, bool>> aiExpWhenTrue, Expression<Func<T, bool>> aiExpWhenFalse)
- {
- AddAndWhere(aiCondition(), aiExpWhenTrue, aiExpWhenFalse);
- }
- #endregion 以 And 相联接 Where条件语句
- #region 以 Or 相联接 Where条件语句
- /// <summary>
- /// 添加一个Where条件语句,如果语句存在,则以 Or 相联接
- /// </summary>
- /// <param name="aiExp">Where条件表达示</param>
- public void AddOrWhere(Expression<Func<T, bool>> aiExp)
- {
- SetOneConditionStr(aiExp, LambdaExpUnion.Or);
- }
- /// <summary>
- /// 当给定条件满足时,添加一个Where条件语句,如果语句存在,则以 Or 相联接
- /// </summary>
- /// <param name="aiCondition">给定条件</param>
- /// <param name="aiExp">Where条件表达示</param>
- public void AddOrWhere(bool aiCondition, Expression<Func<T, bool>> aiExp)
- {
- if (aiCondition)
- {
- SetOneConditionStr(aiExp, LambdaExpUnion.Or);
- }
- }
- /// <summary>
- /// 当给定lambda表达式条件满足时,添加一个Where条件语句,如果语句存在,则以 Or 相联接
- /// </summary>
- /// <param name="aiCondition">给定lambda表达式条件</param>
- /// <param name="aiExp"></param>
- public void AddOrWhere(Func<bool> aiCondition, Expression<Func<T, bool>> aiExp)
- {
- AddOrWhere(aiCondition(), aiExp);
- }
- /// <summary>
- /// 如果条件满足时,将添加前一个条件语句(Where),否则添加后一个,以 Or 相联接
- /// </summary>
- /// <param name="aiCondition">条件</param>
- /// <param name="aiExpWhenTrue">条件为真时</param>
- /// <param name="aiExpWhenFalse">条件为假时</param>
- public void AddOrWhere(bool aiCondition, Expression<Func<T, bool>> aiExpWhenTrue, Expression<Func<T, bool>> aiExpWhenFalse)
- {
- if (aiCondition)
- {
- SetOneConditionStr(aiExpWhenTrue, LambdaExpUnion.Or);
- }
- else
- {
- SetOneConditionStr(aiExpWhenFalse, LambdaExpUnion.Or);
- }
- }
- /// <summary>
- /// 如果条件满足时,将添加前一个条件语句(Where),否则添加后一个,以 Or 相联接
- /// </summary>
- /// <param name="aiCondition">Lambda条件</param>
- /// <param name="aiExpWhenTrue">条件为真时</param>
- /// <param name="aiExpWhenFalse">条件为假时</param>
- public void AddOrWhere(Func<bool> aiCondition, Expression<Func<T, bool>> aiExpWhenTrue, Expression<Func<T, bool>> aiExpWhenFalse)
- {
- AddOrWhere(aiCondition(), aiExpWhenTrue, aiExpWhenFalse);
- }
- #endregion 以 Or 相联接 Where条件语句
- #region OrderBy语句
- /// <summary>
- /// 添加一个OrderBy语句
- /// </summary>
- /// <typeparam name="TD">OrderBy的字段数据类型</typeparam>
- /// <param name="aiExp">OrderBy条件表达示</param>
- public void AddOrderBy<TD>(Expression<Func<T, TD>> aiExp)
- {
- SetOneConditionStr(aiExp, LambdaExpUnion.OrderBy);
- }
- /// <summary>
- /// 如果条件满足时,添加一个OrderBy语句
- /// </summary>
- /// <typeparam name="TD">OrderBy的字段数据类型</typeparam>
- /// <param name="aiCondition">条件</param>
- /// <param name="aiExp">OrderBy条件表达示</param>
- public void AddOrderBy<TD>(bool aiCondition, Expression<Func<T, TD>> aiExp)
- {
- if (aiCondition)
- {
- SetOneConditionStr(aiExp, LambdaExpUnion.OrderBy);
- }
- }
- /// <summary>
- /// 如果条件满足时,添加一个OrderBy语句
- /// </summary>
- /// <typeparam name="TD">OrderBy的数据字段类型</typeparam>
- /// <param name="aiCondition">Lambda条件</param>
- /// <param name="aiExp">OrderBy条件表达示</param>
- public void AddOrderBy<TD>(Func<bool> aiCondition, Expression<Func<T, TD>> aiExp)
- {
- AddOrderBy<TD>(aiCondition(), aiExp);
- }
- /// <summary>
- /// 如果条件满足时,将添加前一个OrderBy语句,否则添加后一个
- /// </summary>
- /// <typeparam name="TD">OrderBy的数据字段类型</typeparam>
- /// <param name="aiCondition">条件</param>
- /// <param name="aiExpWhenTrue">条件为真时</param>
- /// <param name="aiExpWhenFalse">条件为假时</param>
- public void AddOrderBy<TD>(bool aiCondition, Expression<Func<T, TD>> aiExpWhenTrue, Expression<Func<T, TD>> aiExpWhenFalse)
- {
- if (aiCondition)
- {
- SetOneConditionStr(aiExpWhenTrue, LambdaExpUnion.OrderBy);
- }
- else
- {
- SetOneConditionStr(aiExpWhenFalse, LambdaExpUnion.OrderBy);
- }
- }
- /// <summary>
- /// 如果条件满足时,将添加前一个OrderBy语句,否则添加后一个
- /// </summary>
- /// <typeparam name="TD">OrderBy的数据字段类型</typeparam>
- /// <param name="aiCondition">Lambda条件</param>
- /// <param name="aiExpWhenTrue">条件为真时</param>
- /// <param name="aiExpWhenFalse">条件为假时</param>
- public void AddOrderBy<TD>(Func<bool> aiCondition, Expression<Func<T, TD>> aiExpWhenTrue, Expression<Func<T, TD>> aiExpWhenFalse)
- {
- AddOrderBy<TD>(aiCondition(), aiExpWhenTrue, aiExpWhenFalse);
- }
- #endregion OrderBy语句
- #region 内部操作
- /// <summary>
- /// Where语句
- /// </summary>
- private string _aiWhereStr = string.Empty;
- /// <summary>
- /// OrderBy语句
- /// </summary>
- 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 内部操作
-
- }
- }
|