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 where T : BaseEntity { public static IQueryable GetQuery(IQueryable inputQuery, ISpecification 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; } } }