private static KeyValuePair <string, object> MemberConvert(MemberExpression expression, object obj) { Func <MemberExpression, object> valueGetter = exp => { var objectMember = Expression.Convert(exp, typeof(object)); var getterLambda = Expression.Lambda <Func <object> >(objectMember); return(getterLambda.Compile()()); }; switch (expression.Member.MemberType) { case MemberTypes.Field: { return(new KeyValuePair <string, object>(Guid.NewGuid().ToString("N"), valueGetter(expression))); } case MemberTypes.Property: { if (expression.Expression.NodeType == ExpressionType.MemberAccess) { return(new KeyValuePair <string, object>(Guid.NewGuid().ToString("N"), valueGetter(expression))); } if (obj != null) { var objType = obj.GetType(); if (expression.Member.ReflectedType != null && expression.Member.ReflectedType.IsAssignableFrom(objType)) { var property = objType.GetProperty(expression.Member.Name); if (property != null) { var value = property.GetValue(obj, null); if (value != null) { return(new KeyValuePair <string, object>(Guid.NewGuid().ToString("N"), value)); } } } } DataConfigureAttribute attribute = DataConfigureAttribute.GetAttribute(expression.Member.ReflectedType); string column = attribute != null?attribute.GetPropertyMapper(expression.Member.Name) : expression.Member.Name; return(new KeyValuePair <string, object>(column, null)); } } return(new KeyValuePair <string, object>()); }
public DataFilter GetDataFilter <T>() { DataConfigureAttribute custAttribute = DataConfigureAttribute.GetAttribute <T>(); DataFilter filter = new DataFilter(); List <Condition> conditions = new List <Condition>(); List <ConditionGroup> groups = new List <ConditionGroup>(); _propertyInfos = typeof(T).GetProperties(); foreach (var item in _form.AllKeys) { string property = GetConditionProperty(item); if (property.IsNullOrEmpty()) { continue; } #region 单个件 int conditionIndex = GetConditionIndex(item); if (conditionIndex >= 0) { if (conditionIndex == conditions.Count) { conditions.Add(new Condition()); } SetCondition(conditions[conditionIndex], property, _form[item]); } #endregion #region 组合条件 int groupIndex = GetConditionGroupIndex(item); if (groupIndex >= 0) { if (groupIndex == groups.Count) { groups.Add(new ConditionGroup()); } int groupConditionIndex = GetGroupConditionIndex(item); if (groupConditionIndex >= 0) { if (groupConditionIndex == groups[groupIndex].Conditions.Count) { groups[groupIndex].Conditions.Add(new Condition()); } SetCondition(groups[groupIndex].Conditions[groupConditionIndex], property, _form[item]); } else { SetGroup(groups[groupIndex], property, _form[item]); } } #endregion } foreach (var con in conditions) { if (custAttribute != null) { con.Property = custAttribute.GetPropertyMapper(con.Property); } filter.Where(con); } foreach (var gro in groups) { if (custAttribute != null) { foreach (var con in gro.Conditions) { con.Property = custAttribute.GetPropertyMapper(con.Property); } } filter.Where(gro); } for (int i = 0; ; i++) { string orderp = _form[string.Format("OrderBy[{0}][OrderCol]", i)]; string orderType = _form[string.Format("OrderBy[{0}][OrderType]", i)]; if (string.IsNullOrEmpty(orderp) || string.IsNullOrEmpty(orderType)) { break; } Order order = new Order { Property = orderp }; if (custAttribute != null) { order.Property = custAttribute.GetPropertyMapper(order.Property); } order.OrderType = (OrderType)int.Parse(orderType); filter.OrderBy(order); } return(filter); }
public DataFilter GetDataFilter <T>() { DataConfigureAttribute custAttribute = DataConfigureAttribute.GetAttribute <T>(); DataFilter filter = new DataFilter(); int conditionIndex = -1; int groupIndex = -1; int groupConditionIndex = -1; ConditionGroup Group = new ConditionGroup(); foreach (var item in _form.AllKeys) { #region 单件 int tempIndex = GetConditionIndex(item); if (tempIndex >= 0 && conditionIndex != tempIndex) { conditionIndex = tempIndex; string value = _form[string.Format("Conditions[{0}][Value]", tempIndex)]; if (!string.IsNullOrEmpty(value)) { Condition condition = new Condition(); condition.Property = _form[string.Format("Conditions[{0}][Property]", tempIndex)]; if (custAttribute != null) { condition.Property = custAttribute.GetPropertyMapper(condition.Property); } condition.OperatorType = (OperatorType)int.Parse(_form[string.Format("Conditions[{0}][OperatorType]", tempIndex)]); condition.ConditionType = (ConditionType)int.Parse(_form[string.Format("Conditions[{0}][ConditionType]", tempIndex)]); condition.Value = ConvertValue(_form[string.Format("Conditions[{0}][DataType]", tempIndex)], value); filter.Where(condition); } } #endregion #region 条件组合 int tempGroupIndex = GetConditionGroupIndex(item); if (tempGroupIndex >= 0) { if (tempGroupIndex != groupIndex && groupIndex != -1) { filter.Where(Group); groupConditionIndex = -1; groupIndex = -1; Group = new ConditionGroup(); } groupIndex = tempGroupIndex; int tempGroupConditionIndex = GetGroupConditionIndex(tempGroupIndex, item); if (tempGroupConditionIndex >= 0 && groupConditionIndex != tempGroupConditionIndex) { groupConditionIndex = tempGroupConditionIndex; string value = _form[string.Format("ConditionGroups[{0}][Conditions][{1}][Value]", tempGroupIndex, tempGroupConditionIndex)]; if (!string.IsNullOrEmpty(value)) { Condition condition = new Condition(); string proterty = _form[string.Format("ConditionGroups[{0}][Conditions][{1}][Property]", tempGroupIndex, tempGroupConditionIndex)]; condition.Property = proterty; if (custAttribute != null) { condition.Property = custAttribute.GetPropertyMapper(condition.Property); } condition.OperatorType = (OperatorType)int.Parse(_form[string.Format("ConditionGroups[{0}][Conditions][{1}][OperatorType]", tempGroupIndex, tempGroupConditionIndex)]); condition.ConditionType = (ConditionType)int.Parse(_form[string.Format("ConditionGroups[{0}][Conditions][{1}][ConditionType]", tempGroupIndex, tempGroupConditionIndex)]); condition.Value = ConvertValue(_form[string.Format("ConditionGroups[{0}][Conditions][{1}][ConditionType]", tempGroupIndex, tempGroupConditionIndex)], value); if (custAttribute != null) { PropertyDataInfo propertyDataInfo = custAttribute.MetaData.PropertyDataConfig[proterty]; if (propertyDataInfo.Search != null) { condition = propertyDataInfo.Search(condition); } } Group.Add(condition); } } } #endregion } if (Group.Conditions.Count > 0) { filter.Where(Group); } for (int i = 0; ; i++) { string orderp = _form[string.Format("OrderBy[{0}][OrderCol]", i)]; string orderType = _form[string.Format("OrderBy[{0}][OrderType]", i)]; if (string.IsNullOrEmpty(orderp) || string.IsNullOrEmpty(orderType)) { break; } Order order = new Order(); order.Property = orderp; if (custAttribute != null) { order.Property = custAttribute.GetPropertyMapper(order.Property); } order.OrderType = (OrderType)int.Parse(orderType); filter.OrderBy(order); } return(filter); }