Skip to content

- dotnet 5 and the use of system.text.json might be able to use internal clases of converts for all those types here. #21

@github-actions

Description

@github-actions

annoying that we have to serialize them ourself.

//TODO - dotnet 5 and the use of system.text.json might be able to use internal clases of converts for all those types here.
//annoying that we have to serialize them ourself.

                else
                {
                    var converter = _factory.CreateConverter(item.GetType());
                    var result = converter.Convert(item, queryContext);
                    
                    resultList.Add(result.Value);
                }


            }
            var odatafeature = request.ODataFeature();

            

            return new PageResult<object>(resultList, null, odatafeature.TotalCount);


            // return metadataQuerySet;
            // var setMethod=typeof(DbContext).GetMethod("Set", new Type[] { });
            //  return setMethod.MakeGenericMethod(type.dto).Invoke(this,new object[] { }) as IQueryable;
            //  return Set<Type2>();
        }

        public static async Task<PageResult<object>> ExecuteOData<TContext>(IServiceProvider serviceProvider, IODataFeature odataFeature, string query, Type type, TContext context, IQueryable metadataQuerySet) where TContext : DynamicContext
        {
            List<IQueryExtender<TContext>> queryInspectors = GetQueryInspectors<TContext>(serviceProvider);
            var queryCol = QueryHelpers.ParseNullableQuery(query);

            var request = new ODataFakeHttpRequest()
            {
                Query = new QueryCollection(queryCol),
                QueryString = new QueryString("?" + query.TrimStart('?')),
                HttpContext =
                {
                     RequestServices = serviceProvider
                }
            };
            request.HttpContext.Features.Set<IODataFeature>(odataFeature);

            var queryContext = new QueryContext<TContext>
            {
                Type = type,
                Request = request,
                SkipQueryExtenders = queryInspectors.ToDictionary(x => x, v => false),
                Context = context
            };



            foreach (var queryInspector in queryInspectors.Where(q => !queryContext.SkipQueryExtenders[q]))
                metadataQuerySet = queryInspector.ApplyTo(metadataQuerySet, queryContext).Cast(type) ?? metadataQuerySet;



            if (!queryCol.ContainsKey("$select") && !queryCol.ContainsKey("$apply"))
            {

                request.QueryString = request.QueryString.Add("$select", string.Join(",", type.GetProperties().Where(p => p.GetCustomAttribute<DataMemberAttribute>() != null && p.GetCustomAttribute<InversePropertyAttribute>() == null).Select(p => p.GetCustomAttribute<DataMemberAttribute>().Name)));
                request.Query=new QueryCollection(QueryHelpers.ParseNullableQuery(request.QueryString.Value));
            }
            var odataContext = new ODataQueryContext(context.Manager.Model, type, new Microsoft.OData.UriParser.ODataPath());
            //  IODataFeature odataFeature = request.HttpContext.ODataFeature();
            odataFeature.RoutePrefix = "/api/";

            odataContext.DefaultQueryConfigurations.EnableFilter = true;
            odataContext.DefaultQueryConfigurations.EnableExpand = true;
            odataContext.DefaultQueryConfigurations.EnableSelect = true;
            odataContext.DefaultQueryConfigurations.EnableCount = true;
            odataContext.DefaultQueryConfigurations.EnableSkipToken = true;

            var odata = new ODataQueryOptions(odataContext, request);

            metadataQuerySet = odata.ApplyTo(metadataQuerySet);




            var items = await ((IQueryable<object>) metadataQuerySet).ToListAsync();


            //TODO - dotnet 5 and the use of system.text.json might be able to use internal clases of converts for all those types here.
            //annoying that we have to serialize them ourself.
            var resultList = new List<object>();
            var _factory = request.HttpContext.RequestServices.GetRequiredService<IODataConverterFactory>();
            foreach (var item in items)
            {
                if (item is DynamicEntity)
                {
                    resultList.Add(item);
                }
                else
                {
                    var converter = _factory.CreateConverter(item.GetType());
                    var result = converter.Convert(item, queryContext);
                    resultList.Add(result.Value);
                }


            }


            return new PageResult<object>(resultList, null, odataFeature.TotalCount);


            // return metadataQuerySet;
            // var setMethod=typeof(DbContext).GetMethod("Set", new Type[] { });
            //  return setMethod.MakeGenericMethod(type.dto).Invoke(this,new object[] { }) as IQueryable;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions