コード例 #1
0
        /// <summary>Ors the current filter.</summary>
        /// <param name="filter">The new filter.</param>
        /// <returns>A filter expression.</returns>
        public IFilterExpression <T> Or(string filter)
        {
            this.query = this.queryFactory.Modify(new Dictionary <string, string> {
                { "$filter", $" or {filter}" }
            }, this.query);

            return(this);
        }
        public async Task <IODataQueryable <Track> > GetTracks(IODataQuery <Track> query)
        {
            using (var context = new ChinookEntities())
            {
                var r = query.ApplyTo(context.Track.Include(x => x.Album));

                return(await r.ToListAsync());
            }
        }
コード例 #3
0
        public async Task <IODataQueryable <Album> > GetAlbums(IODataQuery <Album> query)
        {
            using (var context = new ChinookEntities())
            {
                var r = query.ApplyTo(context.Album.Include(x => x.Artist));

                return(await r.ToListAsync());
            }
        }
        public async Task <IEnumerable <Artist> > GetArtists(IODataQuery <Artist> query)
        {
            using (var context = new ChinookEntities())
            {
                var r = query.ApplyTo(context.Artist);

                return(await r.ToListAsync());
            }
        }
コード例 #5
0
        private static SortDefinition <T> CreateODataSort <T>(IODataQuery query, bool check = false)
        {
            var orderby = query.Order;

            SortDefinitionBuilder <T> sortBuilder           = Builders <T> .Sort;
            SortDefinition <T>        sortDefinition        = null;
            SortDefinition <T>        defaultSortDefinition = sortBuilder.Descending("CreateDate");

            if (String.IsNullOrEmpty(orderby))
            {
                return(defaultSortDefinition);
            }

            var sections = orderby.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var section in sections)
            {
                var order     = section.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries);
                var field     = order.FirstOrDefault();
                var direction = "asc";

                if (check && !typeof(T).HasField(field))
                {
                    continue;
                }

                if (order.LastOrDefault().ToLower() == "desc")
                {
                    direction = "desc";
                }

                if (sortDefinition == null)
                {
                    sortDefinition = direction == "asc"
                        ? sortBuilder.Ascending(field)
                        : sortBuilder.Descending(field);
                }

                sortDefinition = direction == "asc"
                    ? sortDefinition.Ascending(field)
                    : sortDefinition.Descending(field);
            }

            return(sortDefinition ?? defaultSortDefinition);
        }
コード例 #6
0
        private static FilterDefinition <T> CreateODataFilter <T>(IODataQuery query, bool check = false)
        {
            var filter = query.Filter;

            if (String.IsNullOrEmpty(filter))
            {
                return(FilterDefinition <T> .Empty);
            }

            var sections     = filter.Split(new string[] { " and ", " or " }, StringSplitOptions.RemoveEmptyEntries);
            var firstSection = sections.FirstOrDefault();

            var fieldIdx    = firstSection.IndexOf(" ");
            var operatorIdx = firstSection.IndexOf(" ", fieldIdx + 1);

            var field        = firstSection.Substring(0, fieldIdx);
            var operatorName = firstSection.Substring(fieldIdx + 1, operatorIdx - fieldIdx - 1);
            var stringValue  = firstSection.Substring(operatorIdx + 1);

            object value = stringValue;

            if (check)
            {
                var propery = typeof(T)
                              .GetProperties()
                              .Where(r => r.Name.ToLower() == field.ToLower())
                              .SingleOrDefault();

                if (propery == null)
                {
                    return(FilterDefinition <T> .Empty);
                }

                value = Cast(stringValue, propery.PropertyType);
            }

            if (value == null)
            {
                return(FilterDefinition <T> .Empty);
            }

            return(CreatePredicate <T>(operatorName, field, value));
        }
コード例 #7
0
 /// <summary>Initializes a new instance of the <see cref="FilterExpression{T}" /> class.</summary>
 /// <param name="queryFactory">The query options factory.</param>
 /// <param name="query">The query.</param>
 internal FilterExpression(IODataQueryFactory queryFactory, IODataQuery <T> query)
 {
     this.queryFactory = queryFactory;
     this.query        = query;
 }
コード例 #8
0
        /// <summary>Modifies the original query and returns a new one.</summary>
        /// <typeparam name="T">The object type.</typeparam>
        /// <param name="clauses">The clauses.</param>
        /// <param name="original">The original query.</param>
        /// <returns>A new query.</returns>
        public IODataQuery <T> Modify <T>(Dictionary <string, string> clauses, IODataQuery <T> original)
        {
            var builder = new UriBuilder(original.Options.Request.RequestUri);

            // Modify query string items
            var querystring = this.GetQueryParameters(original.Options.Request, original.Options.Context);

            if (clauses.ContainsKey("$filter"))
            {
                if (!querystring.ContainsKey("$filter"))
                {
                    if (clauses["$filter"].Trim().StartsWith("and"))
                    {
                        querystring["$filter"] = clauses["$filter"].Trim().Substring(3).Trim();
                    }
                    else if (clauses["$filter"].Trim().StartsWith("or"))
                    {
                        querystring["$filter"] = clauses["$filter"].Trim().Substring(2).Trim();
                    }
                    else
                    {
                        querystring["$filter"] = clauses["$filter"];
                    }
                }
                else
                {
                    querystring["$filter"] = querystring["$filter"] + clauses["$filter"];
                }
            }

            if (clauses.ContainsKey("$orderby"))
            {
                if (!querystring.ContainsKey("$orderby"))
                {
                    querystring["$orderby"] = clauses["$orderby"].Trim().StartsWith(",") ? clauses["$orderby"].Trim().Substring(1) : clauses["$orderby"];
                }
                else
                {
                    querystring["$orderby"] = querystring["$orderby"] + clauses["$orderby"];
                }
            }

            if (clauses.ContainsKey("$expand"))
            {
                if (!querystring.ContainsKey("$expand"))
                {
                    querystring["$expand"] = clauses["$expand"].Trim().StartsWith(",") ? clauses["$expand"].Trim().Substring(1) : clauses["$expand"];
                }
                else
                {
                    querystring["$expand"] = querystring["$expand"] + clauses["$expand"];
                }
            }

            if (clauses.ContainsKey("$select"))
            {
                if (!querystring.ContainsKey("$select"))
                {
                    querystring["$select"] = clauses["$select"].Trim().StartsWith(",") ? clauses["$select"].Trim().Substring(1) : clauses["$select"];
                }
                else
                {
                    querystring["$select"] = querystring["$select"] + clauses["$select"];
                }
            }

            builder.Query = string.Join("&", querystring.Select(x => $"{x.Key}={this.EscapeODataQueryComponent(x.Value)}"));

            var mappedRequest = this.Clone(original.Options.Request);

            mappedRequest.RequestUri = builder.Uri;

            return(new ODataQuery <T>(original.Options.Context, mappedRequest));
        }
コード例 #9
0
        public static async Task <PagedCollection <T> > ApplyOData <T>(this IMongoCollection <T> collection, IODataQuery query)
        {
            var page  = 1;
            var skip  = query.Skip.Normalize(0);
            var limit = query.Limit.Normalize(10, 1000);

            var countFacet = AggregateFacet.Create("count",
                                                   PipelineDefinition <T, AggregateCountResult> .Create(new[]
            {
                PipelineStageDefinitionBuilder.Count <T>()
            }));

            var sort   = CreateODataSort <T>(query, false);
            var filter = CreateODataFilter <T>(query, false);

            var dataFacet = AggregateFacet.Create("data",
                                                  PipelineDefinition <T, T> .Create(new []
            {
                PipelineStageDefinitionBuilder.Sort(sort),
                PipelineStageDefinitionBuilder.Skip <T>(skip),
                PipelineStageDefinitionBuilder.Limit <T>(limit),
            }));

            var aggregation = await collection.Aggregate()
                              .Match(filter)
                              .Facet(countFacet, dataFacet)
                              .ToListAsync();

            var count = aggregation.First()
                        .Facets.First(x => x.Name == "count")
                        .Output <AggregateCountResult>()
                        .First()
                        .Count;

            int totalPages = (int)(count / limit);

            var data = aggregation.First()
                       .Facets.First(x => x.Name == "data")
                       .Output <T>();

            return(PagedCollection <T> .Create(data, page, limit, totalPages, count));
        }