/// <summary> /// Парсинг параметра в дерево /// </summary> /// <param name="item">Параметр</param> /// <param name="separator">Символ разделитель элементов строки</param> /// <returns>Узел дерева, соответствующий последнему элементу дерева</returns> private TreeNode ParseItem(ParameterStringItem item, TreeNode root, IList <string> vals) { var val = vals[0]; vals.RemoveAt(0); var currentNode = FindNode(root, val); if (currentNode == null) { if (vals.Count == 0) { currentNode = root.Add(val, item); } else { currentNode = root.Add(val, null); } } else { if (vals.Count == 0) { currentNode.Value = item; } } if (vals.Count > 0) { currentNode = ParseItem(item, currentNode, vals); } return(currentNode); }
private void CreateFilterCondition <T, TParent>(object criterion, ParameterStringItem value, string key, bool isClass) where T : class where TParent : class { object crit = criterion; int last = key.LastIndexOf('.'); if (last > 0) { crit = CreateCriteria <T>(key, criterion); } object val = ""; if (value.Value is IList <string> ) { val = (value.Value as IList <string>)[0]; } else { val = value.Value; } switch (value.Operation) { case ParameterStringItem.OperationType.Like: if ((val as string).Length > 0) { crit.GetType().GetMethod("Like", new Type[] { typeof(string), typeof(string) }) .Invoke(crit, new object[] { key.Substring(last + 1), val }); } break; case ParameterStringItem.OperationType.Eq: if (val == null || (val as string).Length > 0) { crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) }) .Invoke(crit, new object[] { key.Substring(last + 1) + (isClass ? ".Id" : ""), CriteriaCond.Eq, val }); } break; case ParameterStringItem.OperationType.NotEq: if (val == null || (val as string).Length > 0) { crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) }) .Invoke(crit, new object[] { key.Substring(last + 1) + (isClass ? ".Id" : ""), CriteriaCond.NotEq, val }); } break; case ParameterStringItem.OperationType.OneOf: crit.GetType().GetMethod("OneOf", new Type[] { typeof(string), typeof(IEnumerable) }) .Invoke(crit, new object[] { key.Substring(last + 1) + (isClass ? ".Id" : ""), value.Value }); break; case ParameterStringItem.OperationType.NotOneOf: crit.GetType().GetMethod("NotOneOf", new Type[] { typeof(string), typeof(IEnumerable) }) .Invoke(crit, new object[] { key.Substring(last + 1) + (isClass ? ".Id" : ""), value.Value }); break; } }
/// <summary> /// Добавление дочернего узла дерева /// </summary> /// <param name="name">имя узла</param> /// <param name="value">значение узла</param> /// <returns>Добавленный узел</returns> public TreeNode Add(string name, ParameterStringItem value = null) { var node = new TreeNode(name, value); childNodes.Add(node); return(node); }
/// <summary> /// Парсинг параметра в дерево /// </summary> /// <param name="item">Параметр</param> /// <param name="separator">Символ разделитель элементов строки</param> /// <returns>Узел дерева, соответствующий последнему элементу дерева</returns> private TreeNode ParseItem(ParameterStringItem item, char separator) { var vals = new List <string>(item.Key.Split(separator, '.')); var currentNode = root; currentNode = ParseItem(item, root, vals); return(currentNode); }
private void CreateFilterConditionOR <T>(object criteria, ParameterStringItem value) where T : class { Type type; var list = value.Value as List <ParameterStringItem>; type = GetProperty(typeof(T), list[0].Key); if (type != typeof(string)) { CreateFilterCondition <T>(criteria, list[0], type.IsClass); } else { if (list[0].Operation == ParameterStringItem.OperationType.Eq) { list[0].Operation = ParameterStringItem.OperationType.Like; } CreateFilterCondition <T>(criteria, list[0], false); } type = GetProperty(typeof(T), list[1].Key); if (type != typeof(string)) { CreateFilterCondition <T>(criteria, list[1], type.IsClass); } else { if (list[1].Operation == ParameterStringItem.OperationType.Eq) { list[1].Operation = ParameterStringItem.OperationType.Like; } CreateFilterCondition <T>(criteria, list[1], false); } criteria.GetType().GetMethod("Or", System.Type.EmptyTypes).Invoke(criteria, null); }
/// <summary> /// Ограничение выборки задач по пользователям /// </summary> /// <param name="ps">Параметры фильтрации</param> /// <param name="key">имя поля</param> /// <param name="user">Пользователь</param> /// <param name="permission">Право, по корому ограничивается выборка</param> private ParameterStringItem RestrictOnUserByPermission(string key, User user, Permission permission) { ParameterStringItem result = null; switch (user.GetPermissionDistributionType(permission)) { case PermissionDistributionType.All: result = new ParameterStringItem("Id", ParameterStringItem.OperationType.NotEq, "0"); // Заведомо истинное условие break; case PermissionDistributionType.None: result = new ParameterStringItem(key, ParameterStringItem.OperationType.Eq, "0"); break; case PermissionDistributionType.Personal: result = new ParameterStringItem(key, ParameterStringItem.OperationType.Eq, user.Id.ToString()); break; case PermissionDistributionType.Teams: var list = user.Teams.SelectMany(x => x.Users).Select(x => x.Id.ToString()); if (list.Count() > 0) { result = new ParameterStringItem(key, ParameterStringItem.OperationType.OneOf, list); } else { result = new ParameterStringItem(key, ParameterStringItem.OperationType.Eq, user.Id.ToString()); } break; default: throw new Exception(String.Format("Неизвестное распространение права «{0}».", permission.GetDisplayName())); } return(result); }
/// <summary> /// Конструктор /// </summary> /// <param name="name">имя узла</param> /// <param name="value">значение узла</param> public TreeNode(string name, ParameterStringItem value = null) { Name = name; Value = value; }
private void CreateFilterCondition <T>(object criteria, ParameterStringItem value, bool isClass) where T : class { var key = value.Key.Replace("_", "."); var crit = CreateCriteria <T>(key, criteria); object val = ""; if (value.Value is IList <string> ) { //Проверяем наличие значений, если нет, то выходим if ((value.Value as IList <string>).Count == 0) { return; } //Значения есть, обрабатываем val = (value.Value as IList <string>)[0]; } else { val = value.Value; } var propKey = key.Substring(key.LastIndexOf('.') + 1); switch (value.Operation) { case ParameterStringItem.OperationType.Like: if ((val as string).Length > 0) { crit = crit.GetType().GetMethod("Like", new Type[] { typeof(string), typeof(string) }) .Invoke(crit, new object[] { propKey, val }); } break; case ParameterStringItem.OperationType.Eq: if (val == null || ((val is Guid) || (val is string && (val as string).Length > 0))) { crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) }) .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.Eq, val }); } break; case ParameterStringItem.OperationType.NotEq: if (val == null || (val as string).Length > 0) { crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) }) .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.NotEq, val }); } break; case ParameterStringItem.OperationType.OneOf: crit = crit.GetType().GetMethod("OneOf", new Type[] { typeof(string), typeof(IEnumerable) }) .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), value.Value }); break; case ParameterStringItem.OperationType.NotOneOf: crit = crit.GetType().GetMethod("NotOneOf", new Type[] { typeof(string), typeof(IEnumerable) }) .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), value.Value }); break; case ParameterStringItem.OperationType.Gt: if (val == null || ((val is Guid) || (val is string && (val as string).Length > 0))) { crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) }) .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.Gt, val }); } break; case ParameterStringItem.OperationType.Ge: if (val == null || ((val is Guid) || (val is string && (val as string).Length > 0))) { crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) }) .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.Ge, val }); } break; case ParameterStringItem.OperationType.Lt: if (val == null || ((val is Guid) || (val is string && (val as string).Length > 0))) { crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) }) .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.Lt, val }); } break; case ParameterStringItem.OperationType.Le: if (val == null || ((val is Guid) || (val is string && (val as string).Length > 0))) { crit = crit.GetType().GetMethod("Where", new Type[] { typeof(string), typeof(CriteriaCond), typeof(object) }) .Invoke(crit, new object[] { propKey + (isClass ? ".Id" : ""), CriteriaCond.Le, val }); } break; } }