using IWareDataAccess.Helper; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; namespace IWareDataAccess.Helper { public static class PredicateBuilder { private const String str_Start = "Start"; private const String str_End = "End"; public static Expression> True() { return f => true; } public static Expression> False() { return f => false; } public static Expression> Or(this Expression> expr1, Expression> expr2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast()); return Expression.Lambda> (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters); } public static Expression> And(this Expression> expr1, Expression> expr2) { var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast()); return Expression.Lambda> (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters); } /// /// 获取筛选条件的查询表达式 /// /// 查询对象 /// 返回对象 /// /// public static Expression> GetFilterExpression(T t) { var f = PredicateBuilder.True(); //便利所有属性 Type type = t.GetType(); foreach (var i in type.GetProperties()) { var _noDbFilterAttribute = AttributeHelper.GetNoDbFilterAttributeByPro(i); if (_noDbFilterAttribute.Length > 0) { continue; } object v = Helper.GetFieldValueByName(t, i.Name); if (i.PropertyType == typeof(String)) { string value; if (v != null) { value = v.ToString(); f = f.And(x => Helper.GetFieldValueByName(x, i.Name) != null ? Helper.GetFieldValueByName(x, i.Name).ToString() == value : false); } } else if (i.PropertyType == typeof(DateTime?)) { if (v != null) { DateTime value = DateTime.Parse(v.ToString()); if (i.Name.IndexOf(str_Start) > -1) { var name = GetTimeName(i.Name, str_Start); //f = f.And(x => x.updateTime > value); f = f.And(x => Helper.GetFieldValueByName(x, name) != null ? Convert.ToDateTime(Helper.GetFieldValueByName(x, name)) > value : false); } if (i.Name.IndexOf(str_End) > -1) { var name = GetTimeName(i.Name, str_End); //f = f.And(x => x.updateTime < value); f = f.And(x => Helper.GetFieldValueByName(x, name) != null ? Convert.ToDateTime(Helper.GetFieldValueByName(x, name)) < value : false); } } } else { if (v != null) { f = f.And(x => Object.Equals(Helper.GetFieldValueByName(x, i.Name), v)); } } } return f; } /// /// 解析前台查询传过来的属性名 /// /// /// private static string GetTimeName(string inputName, string indexName) { //updateTimeStart updateTimeEnd //doTimeStart doTimeEnd createTimeEnd //createTimeStart int index = 0; index = inputName.IndexOf(indexName); if (index > -1) { return inputName.Substring(0, index); } return inputName; } } }