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