示例#1
0
        /// <summary>
        /// Adds <see cref="TextQuery"/> to query.
        /// </summary>
        /// <param name="wrapper">Query wrapper.</param>
        /// <param name="query">Query object.</param>
        /// <param name="paths">Expression path to querying field.</param>
        public static QueryWrapper <T> Text <T>(this QueryWrapper <T> wrapper, TextQuery query, params Expression <Func <T, object> >[] paths) where T : class
        {
            if (query == null || !query.IsSpecified)
            {
                return(wrapper);
            }

            return(wrapper.AddQuery(descriptor =>
            {
                var container = null as QueryContainer;

                foreach (var value in query.Values)
                {
                    if (string.IsNullOrEmpty(value))
                    {
                        continue;
                    }

                    var c = descriptor.SimpleQueryString(q => q.Query(value).Fields(f => paths.Aggregate(f, (ff, p) => ff.Field(p))).DefaultOperator(query.Mode == QueryMatchMode.All ? Operator.And : Operator.Or));

                    if (container == null)
                    {
                        container = c;
                    }
                    else
                    {
                        switch (query.Mode)
                        {
                        case QueryMatchMode.Any:
                            container |= c;
                            break;

                        case QueryMatchMode.All:
                            container &= c;
                            break;
                        }
                    }
                }

                return container;
            }));
        }
示例#2
0
        /// <summary>
        /// Adds <see cref="FilterQuery{T}"/> to query.
        /// </summary>
        /// <param name="wrapper">Query wrapper.</param>
        /// <param name="query">Query object.</param>
        /// <param name="path">Expression path to querying field.</param>
        public static QueryWrapper <T> Filter <T, TField>(this QueryWrapper <T> wrapper, FilterQuery <TField> query, Expression <Func <T, object> > path) where T : class
        {
            if (query == null || !query.IsSpecified)
            {
                return(wrapper);
            }

            return(wrapper.AddQuery(descriptor =>
            {
                var container = null as QueryContainer;

                foreach (var value in query.Values)
                {
                    var c = descriptor.Term(t => t.Field(path).Value(value));

                    if (container == null)
                    {
                        container = c;
                    }
                    else
                    {
                        switch (query.Mode)
                        {
                        case QueryMatchMode.Any:
                            container |= c;
                            break;

                        case QueryMatchMode.All:
                            container &= c;
                            break;
                        }
                    }
                }

                return container;
            }));
        }
示例#3
0
 /// <summary>
 /// Nested equivalent of <see cref="MultiQuery{T}"/>.
 /// </summary>
 public static QueryWrapper <T> Nested <T>(this QueryWrapper <T> wrapper, Func <QueryWrapper <T>, QueryWrapper <T> > query) where T : class
 => wrapper.AddQuery(q => query(new QueryWrapper <T>(q)).Container);