public QueryFilterBooleanOperator(QueryFilterClause arg1, QueryFilterClause arg2)
 {
     if (arg1 is QueryFilterBooleanOperator)
     {
         Child1 = arg1 as QueryFilterBooleanOperator;
     }
     else
     {
         Argument1 = arg1 as QueryFilterCondition;
     }
     if (arg2 is QueryFilterBooleanOperator)
     {
         Child2 = arg2 as QueryFilterBooleanOperator;
     }
     else
     {
         Argument2 = arg2 as QueryFilterCondition;
     }
 }
        public void AddFilterCondition(QueryFilterClause filter, bool useOr = false)
        {
            var res = filter;

            if (res == null)
            {
                return;
            }
            if (Filter == null)
            {
                Filter = res is QueryFilterBooleanOperator ? res as QueryFilterBooleanOperator
                      : new QueryFilterBooleanOperator(res, null);
                return;
            }

            QueryFilterClause cleanFilter;

            if (Filter.Operator != QueryFilterBooleanOperator.not)
            {
                if (Filter.Child1 == null && Filter.Argument1 == null)
                {
                    cleanFilter = Filter.Argument2 as QueryFilterClause ?? Filter.Child2;
                }
                else if (Filter.Child2 == null && Filter.Argument2 == null)
                {
                    cleanFilter = Filter.Argument1 as QueryFilterClause ?? Filter.Child1;
                }
                else
                {
                    cleanFilter = Filter;
                }
            }
            else
            {
                cleanFilter = Filter;
            }
            Filter = new QueryFilterBooleanOperator(cleanFilter, res);
            if (useOr)
            {
                Filter.Operator = QueryFilterBooleanOperator.or;
            }
        }