diff --git a/build.bat b/build.bat index 48c7c73..efd72c5 100644 --- a/build.bat +++ b/build.bat @@ -6,5 +6,6 @@ dotnet build dotnet pack ".\src\AutoQueryable" -c Release -o ".\bin\NuGetPackages" dotnet pack ".\src\AutoQueryable.AspNet.Filter" -c Release -o ".\bin\NuGetPackages" +dotnet pack ".\src\AutoQueryable.AspNetCore.Filter" -c Release -o ".\bin\NuGetPackages" pause \ No newline at end of file diff --git a/src/AutoQueryable.AspNet.Filter/Filters/AutoQueryableFilter.cs b/src/AutoQueryable.AspNet.Filter/FilterAttributes/AutoQueryableFilter.cs similarity index 65% rename from src/AutoQueryable.AspNet.Filter/Filters/AutoQueryableFilter.cs rename to src/AutoQueryable.AspNet.Filter/FilterAttributes/AutoQueryableFilter.cs index 56728d6..e1da801 100644 --- a/src/AutoQueryable.AspNet.Filter/Filters/AutoQueryableFilter.cs +++ b/src/AutoQueryable.AspNet.Filter/FilterAttributes/AutoQueryableFilter.cs @@ -1,14 +1,13 @@ using System; -using System.Linq; using System.Net.Http; using System.Net.Http.Formatting; using System.Web.Http.Filters; -using AutoQueryable.Extensions; +using AutoQueryable.Helpers; using AutoQueryable.Models; -namespace AutoQueryable.AspNet.Filter.Filters +namespace AutoQueryable.AspNet.Filter.FilterAttributes { - public class AutoQueryableFilter : ActionFilterAttribute + public class AutoQueryableAttribute : ActionFilterAttribute { public string[] UnselectableProperties { get; set; } @@ -18,13 +17,11 @@ public override void OnActionExecuted(HttpActionExecutedContext context) var content = context.Response.Content as ObjectContent; if (content != null) { - IQueryable query = content.Value as IQueryable; + dynamic query = content.Value; if (query == null) throw new Exception("Unable to retreive value of IQueryable from context result."); Type entityType = query.GetType().GenericTypeArguments[0]; - string queryString = context.Request.RequestUri.Query; - // Work on generic type directly, for dto projection - var result = query.AutoQueryable(queryString, new AutoQueryableProfile {UnselectableProperties = UnselectableProperties}); + var result = QueryableHelper.GetAutoQuery(queryString, entityType, query, new AutoQueryableProfile {UnselectableProperties = UnselectableProperties}); context.Response.Content = new ObjectContent(result.GetType(), result, new JsonMediaTypeFormatter()); } } diff --git a/src/AutoQueryable.AspNet.Filter/project.json b/src/AutoQueryable.AspNet.Filter/project.json index cedc6aa..4d53bc1 100644 --- a/src/AutoQueryable.AspNet.Filter/project.json +++ b/src/AutoQueryable.AspNet.Filter/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "0.0.1", "dependencies": { @@ -12,5 +12,15 @@ } } - } + }, + "packOptions": { + "licenseUrl": "https://raw.githubusercontent.com/trenoncourt/AutoQueryable/master/LICENSE", + "projectUrl": "https://github.com/trenoncourt/AutoQueryable", + "tags": [ "AutoQueryable", "AutoQuery", "OData" ], + "owners": [ "trenoncourt" ] + }, + + "title": "AutoQueryable.AspNetCore.Filter add filterAttribute for AutoQueryable to Asp.Net >=4.5.1.", + "description": "AutoQueryable.AspNetCore.Filter add filterAttribute for AutoQueryable to Asp.Net >=4.5.1.", + "authors": [ "Thibaut Renoncourt" ] } diff --git a/src/AutoQueryable.AspNetCore.Filter/Attributes/AutoQueryableAttribute.cs b/src/AutoQueryable.AspNetCore.Filter/Attributes/AutoQueryableAttribute.cs deleted file mode 100644 index ce5f42e..0000000 --- a/src/AutoQueryable.AspNetCore.Filter/Attributes/AutoQueryableAttribute.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System; -using AutoQueryable.AspNetCore.Filter.Filters; -using AutoQueryable.Models; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace AutoQueryable.AspNetCore.Filter.Attributes -{ - [AttributeUsage(AttributeTargets.Method)] - public class AutoQueryableAttribute : Attribute, IFilterFactory, IOrderedFilter - { - public string[] UnselectableProperties { get; set; } - - /// - public bool IsReusable { get; set; } - - /// - public int Order { get; set; } - - public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) - { - if (serviceProvider == null) - { - throw new ArgumentNullException(nameof(serviceProvider)); - } - var profile = new AutoQueryableProfile - { - UnselectableProperties = UnselectableProperties - }; - - return new AutoQueryableFilter(profile); - } - } -} diff --git a/src/AutoQueryable.AspNetCore.Filter/FilterAttributes/AutoQueryableAttribute.cs b/src/AutoQueryable.AspNetCore.Filter/FilterAttributes/AutoQueryableAttribute.cs new file mode 100644 index 0000000..d895804 --- /dev/null +++ b/src/AutoQueryable.AspNetCore.Filter/FilterAttributes/AutoQueryableAttribute.cs @@ -0,0 +1,23 @@ +using System; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using AutoQueryable.Helpers; +using AutoQueryable.Models; + +namespace AutoQueryable.AspNetCore.Filter.FilterAttributes +{ + public class AutoQueryableAttribute : ActionFilterAttribute + { + public string[] UnselectableProperties { get; set; } + + public override void OnActionExecuted(ActionExecutedContext context) + { + dynamic query = ((ObjectResult)context.Result).Value; + if (query == null) throw new Exception("Unable to retreive value of IQueryable from context result."); + Type entityType = query.GetType().GenericTypeArguments[0]; + + string queryString = context.HttpContext.Request.QueryString.HasValue ? context.HttpContext.Request.QueryString.Value : null; + context.Result = new OkObjectResult(QueryableHelper.GetAutoQuery(queryString, entityType, query, new AutoQueryableProfile { UnselectableProperties = UnselectableProperties })); + } + } +} \ No newline at end of file diff --git a/src/AutoQueryable.AspNetCore.Filter/Filters/AutoQueryableFilter.cs b/src/AutoQueryable.AspNetCore.Filter/Filters/AutoQueryableFilter.cs deleted file mode 100644 index 2797abf..0000000 --- a/src/AutoQueryable.AspNetCore.Filter/Filters/AutoQueryableFilter.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using AutoQueryable.Helpers; -using AutoQueryable.Models; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Filters; - -namespace AutoQueryable.AspNetCore.Filter.Filters -{ - public class AutoQueryableFilter : ActionFilterAttribute, IActionFilter - { - private readonly AutoQueryableProfile _autoQueryableProfile; - - public AutoQueryableFilter(AutoQueryableProfile autoQueryableProfile) - { - _autoQueryableProfile = autoQueryableProfile; - } - public virtual void OnActionExecuting(ActionExecutingContext context) - { - } - - public virtual void OnActionExecuted(ActionExecutedContext context) - { - dynamic query = ((ObjectResult)context.Result).Value; - if (query == null) throw new Exception("Unable to retreive value of IQueryable from context result."); - Type entityType = query.GetType().GenericTypeArguments[0]; - - string queryString = context.HttpContext.Request.QueryString.HasValue ? context.HttpContext.Request.QueryString.Value : null; - // Work on generic type directly, for dto projection - context.Result = new OkObjectResult(QueryableHelper.GetAutoQuery(queryString, entityType, query, _autoQueryableProfile)); - } - } -} \ No newline at end of file diff --git a/src/AutoQueryable.AspNetCore.Filter/project.json b/src/AutoQueryable.AspNetCore.Filter/project.json index 37bf3c5..88af6e3 100644 --- a/src/AutoQueryable.AspNetCore.Filter/project.json +++ b/src/AutoQueryable.AspNetCore.Filter/project.json @@ -10,5 +10,15 @@ "frameworks": { "netstandard1.6": {} - } + }, + "packOptions": { + "licenseUrl": "https://raw.githubusercontent.com/trenoncourt/AutoQueryable/master/LICENSE", + "projectUrl": "https://github.com/trenoncourt/AutoQueryable", + "tags": [ "AutoQueryable", "AutoQuery", "OData" ], + "owners": [ "trenoncourt" ] + }, + + "title": "AutoQueryable.AspNetCore.Filter add filterAttribute for AutoQueryable to Asp.Net Core.", + "description": "AutoQueryable.AspNetCore.Filter add filterAttribute for AutoQueryable to Asp.Net Core.", + "authors": [ "Thibaut Renoncourt" ] } diff --git a/src/AutoQueryable/Helpers/QueryableHelper.cs b/src/AutoQueryable/Helpers/QueryableHelper.cs index cfff868..de77058 100644 --- a/src/AutoQueryable/Helpers/QueryableHelper.cs +++ b/src/AutoQueryable/Helpers/QueryableHelper.cs @@ -12,14 +12,10 @@ public static dynamic GetAutoQuery(string queryString, Type entityType, { if (string.IsNullOrEmpty(queryString)) { - if (profile?.UnselectableProperties == null) - { - return query; - } - IEnumerable columns = SelectHelper.GetSelectableColumns(profile.UnselectableProperties, entityType); + IEnumerable columns = SelectHelper.GetSelectableColumns(profile?.UnselectableProperties, entityType); return query.Select(SelectHelper.GetSelector(string.Join(",", columns.ToArray()))); } - string[] queryStringParts = queryString?.Replace("?", "")?.Split('&'); + string[] queryStringParts = queryString.Replace("?", "").Split('&'); var criteriaManager = new CriteriaManager(); IList criterias = criteriaManager.GetCriterias(entityType, queryStringParts).ToList(); diff --git a/src/AutoQueryable/Helpers/SelectHelper.cs b/src/AutoQueryable/Helpers/SelectHelper.cs index c65dab2..0ba1e8e 100644 --- a/src/AutoQueryable/Helpers/SelectHelper.cs +++ b/src/AutoQueryable/Helpers/SelectHelper.cs @@ -73,6 +73,10 @@ private static MemberExpression GetMemberExpression(string column, Para public static IEnumerable GetSelectableColumns(Clause selectClause, string[] unselectableProperties, Type entityType) { + if (selectClause == null) + { + return GetSelectableColumns(unselectableProperties, entityType); + } IEnumerable columns = selectClause.Value.Split(','); if (unselectableProperties != null) { diff --git a/src/AutoQueryable/project.json b/src/AutoQueryable/project.json index 497e21d..cd84df0 100644 --- a/src/AutoQueryable/project.json +++ b/src/AutoQueryable/project.json @@ -5,7 +5,7 @@ }, "frameworks": { - "netstandard1.6": { + "netstandard1.3": { "dependencies": { "System.Reflection.Emit": "4.3.0", "System.Linq.Queryable": "4.3.0",