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)