Select

The Select feature defined in Specification behaves the same as Select in Linq, and it takes in IEnumerable<TSource> and Func<TSource, TResult> as its parameters.

Select is used to transform elements in a sequence into a new form. In Specification, Select is most commonly used to select a single property of each object in a list being queried. For example, the below expression could be used to retrieve only the name of each object:

Query.Select(x => x.Name);

Since this query is now returning a different type, the type of Name, rather than of x, the base class of the Specification will need to reflect this. Instead of being a Specification<T>, the Specification will need to be a Specification<T, TReturn>:

public class StoreNamesSpec : Specification<Store, string?>
{
    public StoreNamesSpec()
    {
        Query.Select(x => x.Name);
    }
}