天天看點

C# lamda表達式查詢條件

傳回值清單:

List<FYWZ_UserOprLogRecord> rlist = new List<FYWZ_UserOprLogRecord>();
           

首先需要添加Express的擴充類

public static class PredicateBuilder
    {

        /// <summary>
        /// 機關函數應用True時:單個AND有效,多個AND有效;單個OR無效,多個OR無效;混應時寫在AND後的OR有效  
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static Expression<Func<T, bool>> True<T>() { return f => true; }

        /// <summary>
        /// 機關函數應用False時:單個AND無效,多個AND無效;單個OR有效,多個OR有效;混應時寫在OR後面的AND有效  
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <returns></returns>
        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                            Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.Or(expr1.Body, invokedExpr), expr1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                             Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.And(expr1.Body, invokedExpr), expr1.Parameters);
        }
    }
           

第二步:需要首先初始化查詢對象,因為是Lamda表達式,是以需要有對象,其中FYWZ_UserOprLogRecord就是對應的傳回對象

var expressionwhere = PredicateBuilder.True<FYWZ_UserOprLogRecord>();
           

第三步:添加查詢條件

if (!String.IsNullOrEmpty(searchUserName))
                {
                    expressionwhere = expressionwhere.And(p => p.logUserName == searchUserName);
                }
                if (!String.IsNullOrEmpty(searchContent))
                {
                    expressionwhere = expressionwhere.And(p => p.logContent.Contains(searchContent));
                }
                if (!String.IsNullOrEmpty(startTime))
                {
                    DateTime stimedt = DateTime.Parse(startTime);
                    expressionwhere = expressionwhere.And(p => p.logTime >= stimedt);
                }
                if (!String.IsNullOrEmpty(endTime))
                {
                    DateTime etimedt = DateTime.Parse(endTime).AddDays(1);
                    expressionwhere = expressionwhere.And(p => p.logTime < etimedt);
                }
           

第四步:結果轉換,如果直接是toList(),會報錯

rlist = _context.FYWZ_UserOprLogRecord.Where(expressionwhere.Compile()).AsQueryable().OrderByDescending(o=>o.logTime).ToList();