【整理】Linq to Entity 動態拼接查詢條件(重點是OR)

1.添加類

    public static class PredicateExtensions
    {
        /// <summary>
        /// 機關函數應用True時:單個AND有效,多個AND有效;單個OR無效,多個OR無效;混應時寫在AND後的OR有效。即,設置爲True時所有or語句應該放在and語句之後,否則無效
        /// </summary>
        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        
        /// <summary>
        /// 機關函數應用False時:單個AND無效,多個AND無效;單個OR有效,多個OR有效;混應時寫在OR後面的AND有效。 即,設置爲False時所有or語句應該放在and語句之前,否則無效
        /// </summary>
        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expression1, 
           Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters
                    .Cast<Expression>());

            return Expression.Lambda<Func<T, bool>>(Expression.Or(expression1.Body, invokedExpression),
            expression1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1, 
              Expression<Func<T, bool>> expression2)
        {
            var invokedExpression = Expression.Invoke(expression2, expression1.Parameters
                 .Cast<Expression>());

            return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, 
                   invokedExpression), expression1.Parameters);
        }
    }

2.使用

        /// <summary>
        /// 獲取指定type異常預警
        /// </summary>
        /// <param name="typeArray">整數數組</param>
        /// <returns></returns>
        public List<p2p_log_error> GetNewError(int[] typeArray)
        {
            var predicate = PredicateExtensions.False<p2p_log_error>();//設置爲False,所有and條件都應該放在or之後,如where (type=1 or type=14) and status==0
            foreach (var t in typeArray)
            {
                int type_temp= t;
                predicate = predicate.Or(p => p.type == type_temp);
            }
            var result = entities.p2p_log_error.Where(predicate.Compile());
            return result.Where(p => p.status == 0).OrderByDescending(i => i.id).ToList();
        }


回看以前的代碼,發現了更簡單的寫法,特補充如下:

            int[] typeArray = { 1, 14 };
            var yesterday = DateTime.Now.Date.AddHours(-24);
            var result = entities.p2p_log_error.Where(p => p.status == 0 && p.createtime >= yesterday && typeArray.Contains(p.type)).OrderByDescending(i => i.id);
            return result.ToList();
即or可以使用List或數組的Contains方法處理,轉換的sql爲:type in (1,14)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章