Browse Source
* Paging criterias added in BaseSpecification. New paginated specification added (CatalogFilterPaginatedSpecification) . EFRepository cleaned up and paging implementation added. Usage of the new paging infrastructure in CatalogService (Web and WebRazor). * Use IReadOnlyList<T> instead of List<T> as return type from repositories. * - Ordering possibility added in the specification. - Evaluation of the specification placed in separate class.main
committed by
Steve Smith
9 changed files with 114 additions and 46 deletions
@ -0,0 +1,14 @@ |
|||
using Microsoft.eShopWeb.ApplicationCore.Entities; |
|||
|
|||
namespace Microsoft.eShopWeb.ApplicationCore.Specifications |
|||
{ |
|||
public class CatalogFilterPaginatedSpecification : BaseSpecification<CatalogItem> |
|||
{ |
|||
public CatalogFilterPaginatedSpecification(int skip, int take, int? brandId, int? typeId) |
|||
: base(i => (!brandId.HasValue || i.CatalogBrandId == brandId) && |
|||
(!typeId.HasValue || i.CatalogTypeId == typeId)) |
|||
{ |
|||
ApplyPaging(skip, take); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,44 @@ |
|||
using Microsoft.EntityFrameworkCore; |
|||
using Microsoft.eShopWeb.ApplicationCore.Entities; |
|||
using Microsoft.eShopWeb.ApplicationCore.Interfaces; |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
|
|||
namespace Microsoft.eShopWeb.Infrastructure.Data |
|||
{ |
|||
public class SpecificationEvaluator<T> where T : BaseEntity |
|||
{ |
|||
public static IQueryable<T> GetQuery(IQueryable<T> inputQuery, ISpecification<T> specification) |
|||
{ |
|||
var query = inputQuery; |
|||
|
|||
// modify the IQueryable using the specification's criteria expression
|
|||
if (specification.Criteria != null) |
|||
query = query.Where(specification.Criteria); |
|||
|
|||
// Includes all expression-based includes
|
|||
query = specification.Includes.Aggregate(query, |
|||
(current, include) => current.Include(include)); |
|||
|
|||
// Include any string-based include statements
|
|||
query = specification.IncludeStrings.Aggregate(query, |
|||
(current, include) => current.Include(include)); |
|||
|
|||
// Apply ordering if expressions are set
|
|||
if (specification.OrderBy != null) |
|||
query = query.OrderBy(specification.OrderBy); |
|||
else if (specification.OrderByDescending != null) |
|||
query = query.OrderByDescending(specification.OrderByDescending); |
|||
|
|||
// Apply paging if enabled
|
|||
if (specification.isPagingEnabled) |
|||
{ |
|||
query = query.Skip(specification.Skip) |
|||
.Take(specification.Take); |
|||
} |
|||
return query; |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue