-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
annoying that we have to serialize them ourself.
EAVFramework/src/DynamicContext.cs
Lines 245 to 246 in 75ddb9c
| //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;Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels