diff --git a/PoweredSoft.DynamicQuery.Cli/Program.cs b/PoweredSoft.DynamicQuery.Cli/Program.cs index b2a5a7c..5a939c6 100644 --- a/PoweredSoft.DynamicQuery.Cli/Program.cs +++ b/PoweredSoft.DynamicQuery.Cli/Program.cs @@ -9,6 +9,7 @@ namespace PoweredSoft.DynamicQuery.Cli { public class PersonQueryInterceptor : IQueryInterceptor , IAggregateInterceptor + , IQueryConvertInterceptor //, IBeforeQueryAlteredInterceptor //, IFilterInterceptor { @@ -44,10 +45,21 @@ namespace PoweredSoft.DynamicQuery.Cli public IAggregate InterceptAggregate(IAggregate aggregate) { - if (aggregate.Path == nameof(Person.AgeStr)) + if (aggregate.Path == nameof(PersonModel.AgeStr)) return new Aggregate {Type = aggregate.Type, Path = nameof(Person.Age)}; return aggregate; } + + public object InterceptResultTo(Person entity) + { + var personModel = new PersonModel(); + personModel.Id = entity.Id; + personModel.FirstName = entity.FirstName; + personModel.LastName = entity.LastName; + personModel.Age = entity.Age; + personModel.Sex = entity.Sex; + return personModel; + } } public class Person @@ -56,13 +68,18 @@ namespace PoweredSoft.DynamicQuery.Cli public string FirstName { get; set; } public string LastName { get; set; } public int Age { get; set; } - public string Sexe { get; set; } - public string AgeStr => $"{Age} years old"; + public string Sex { get; set; } } - public class OtherClass + public class PersonModel { - + public int Id { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public int Age { get; set; } + public string Sex { get; set; } + public string AgeStr => $"{Age} years old"; + public string FullName => $"{FirstName} {LastName}"; } class Program @@ -78,11 +95,11 @@ namespace PoweredSoft.DynamicQuery.Cli { var list = new List() { - new Person{ Id = 1, FirstName = "David", LastName = "Lebee", Sexe = "Male", Age = 29 }, - new Person{ Id = 2, FirstName = "Michaela", LastName = "Lebee", Sexe = "Female", Age = 29}, - new Person{ Id = 3, FirstName = "Zohra", LastName = "Lebee", Sexe = "Female", Age = 20}, - new Person{ Id = 4, FirstName = "Eric", LastName = "Vickar", Sexe = "Male", Age = 30}, - new Person{ Id = 5, FirstName = "Susan", LastName = "Vickar", Sexe = "Female", Age = 30}, + new Person{ Id = 1, FirstName = "David", LastName = "Lebee", Sex = "Male", Age = 29 }, + new Person{ Id = 2, FirstName = "Michaela", LastName = "Lebee", Sex = "Female", Age = 29}, + new Person{ Id = 3, FirstName = "Zohra", LastName = "Lebee", Sex = "Female", Age = 20}, + new Person{ Id = 4, FirstName = "Eric", LastName = "Vickar", Sex = "Male", Age = 30}, + new Person{ Id = 5, FirstName = "Susan", LastName = "Vickar", Sex = "Female", Age = 30}, }; var queryable = list.AsQueryable(); diff --git a/PoweredSoft.DynamicQuery.Core/IQueryConvertInterceptor.cs b/PoweredSoft.DynamicQuery.Core/IQueryConvertInterceptor.cs new file mode 100644 index 0000000..5ce4ea8 --- /dev/null +++ b/PoweredSoft.DynamicQuery.Core/IQueryConvertInterceptor.cs @@ -0,0 +1,12 @@ +namespace PoweredSoft.DynamicQuery.Core +{ + public interface IQueryConvertInterceptor : IQueryInterceptor + { + object InterceptResultTo(object entity); + } + + public interface IQueryConvertInterceptor : IQueryInterceptor + { + object InterceptResultTo(T entity); + } +} diff --git a/PoweredSoft.DynamicQuery.Core/IQueryInterceptor.cs b/PoweredSoft.DynamicQuery.Core/IQueryInterceptor.cs index a806bee..3f5c0d2 100644 --- a/PoweredSoft.DynamicQuery.Core/IQueryInterceptor.cs +++ b/PoweredSoft.DynamicQuery.Core/IQueryInterceptor.cs @@ -6,6 +6,4 @@ namespace PoweredSoft.DynamicQuery.Core { } - - } diff --git a/PoweredSoft.DynamicQuery/QueryHandler.cs b/PoweredSoft.DynamicQuery/QueryHandler.cs index 4a26c34..512581f 100644 --- a/PoweredSoft.DynamicQuery/QueryHandler.cs +++ b/PoweredSoft.DynamicQuery/QueryHandler.cs @@ -69,9 +69,15 @@ namespace PoweredSoft.DynamicQuery cgrr.GroupValue = groupRecord.GetDynamicPropertyValue($"Key_{gi}"); if (!isLast) + { cgrr.Data = new List(); + } else - cgrr.Data = groupRecord.GetDynamicPropertyValue>("Records").Cast().ToList(); + { + var entities = groupRecord.GetDynamicPropertyValue>("Records"); + var records = InterceptConvertTo(entities); + cgrr.Data = records; + } if (previousGroupResults.Any()) previousGroupResults.Last().Data.Add(cgrr); @@ -204,9 +210,13 @@ namespace PoweredSoft.DynamicQuery // sorts and paging. ApplySorting(); ApplyPaging(); - - // the data. - result.Data = CurrentQueryable.ToObjectList(); + + // data. + var entities = ((IQueryable)CurrentQueryable).ToList(); + var records = InterceptConvertTo(entities); + result.Data = records; + + // aggregates. result.Aggregates = CalculateTotalAggregate(afterFilterQueryable); return result; diff --git a/PoweredSoft.DynamicQuery/QueryHandlerBase.cs b/PoweredSoft.DynamicQuery/QueryHandlerBase.cs index 842292c..16e8a36 100644 --- a/PoweredSoft.DynamicQuery/QueryHandlerBase.cs +++ b/PoweredSoft.DynamicQuery/QueryHandlerBase.cs @@ -96,6 +96,36 @@ namespace PoweredSoft.DynamicQuery return ret; } + protected virtual List InterceptConvertTo(List entities) + { + var objects = entities.Cast().ToList(); + for (var i = 0; i < objects.Count; i++) + objects[i] = InterceptConvertToObject(objects[i]); + + return objects; + } + + protected virtual object InterceptConvertToObject(object o) + { + o = Interceptors + .Where(t => t is IQueryConvertInterceptor) + .Cast() + .Aggregate(o, (prev, interceptor) => interceptor.InterceptResultTo(prev)); + + o = Interceptors + .Where(t => t is IQueryConvertInterceptor) + .Cast>() + .Aggregate(o, (prev, interceptor) => + { + if (prev is T) + return interceptor.InterceptResultTo((T)prev); + + return o; + }); + + return o; + } + protected virtual List InterceptSort(ISort sort) { var original = new List()