next would be to add a bit more interceptors, example to interface the result of an aggregate and change it :)

This commit is contained in:
David Lebee
2018-10-21 20:27:50 -05:00
parent 13f4ef0b83
commit e217896243
5 changed files with 83 additions and 16 deletions
+14 -4
View File
@@ -69,9 +69,15 @@ namespace PoweredSoft.DynamicQuery
cgrr.GroupValue = groupRecord.GetDynamicPropertyValue($"Key_{gi}");
if (!isLast)
{
cgrr.Data = new List<object>();
}
else
cgrr.Data = groupRecord.GetDynamicPropertyValue<List<T>>("Records").Cast<object>().ToList();
{
var entities = groupRecord.GetDynamicPropertyValue<List<T>>("Records");
var records = InterceptConvertTo<T>(entities);
cgrr.Data = records;
}
if (previousGroupResults.Any())
previousGroupResults.Last().Data.Add(cgrr);
@@ -204,9 +210,13 @@ namespace PoweredSoft.DynamicQuery
// sorts and paging.
ApplySorting<T>();
ApplyPaging<T>();
// the data.
result.Data = CurrentQueryable.ToObjectList();
// data.
var entities = ((IQueryable<T>)CurrentQueryable).ToList();
var records = InterceptConvertTo<T>(entities);
result.Data = records;
// aggregates.
result.Aggregates = CalculateTotalAggregate<T>(afterFilterQueryable);
return result;
@@ -96,6 +96,36 @@ namespace PoweredSoft.DynamicQuery
return ret;
}
protected virtual List<object> InterceptConvertTo<T>(List<T> entities)
{
var objects = entities.Cast<object>().ToList();
for (var i = 0; i < objects.Count; i++)
objects[i] = InterceptConvertToObject<T>(objects[i]);
return objects;
}
protected virtual object InterceptConvertToObject<T>(object o)
{
o = Interceptors
.Where(t => t is IQueryConvertInterceptor)
.Cast<IQueryConvertInterceptor>()
.Aggregate(o, (prev, interceptor) => interceptor.InterceptResultTo(prev));
o = Interceptors
.Where(t => t is IQueryConvertInterceptor<T>)
.Cast<IQueryConvertInterceptor<T>>()
.Aggregate(o, (prev, interceptor) =>
{
if (prev is T)
return interceptor.InterceptResultTo((T)prev);
return o;
});
return o;
}
protected virtual List<ISort> InterceptSort<T>(ISort sort)
{
var original = new List<ISort>()