49 lines
1.7 KiB
C#
49 lines
1.7 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|