Skip to main content Link Search Menu Expand Document (external link)

How to use Specifications with In Memory Collections

You can use Specifications on collections of objects in memory. This approach can be convenient when retrieving data doesn’t require querying a remote or out of process data store like a database. If the process does require querying external persistence, it is better to refer to the practices for using a Specification with a Repository Pattern or DbContext.

A Specification can be applied to an in memory collection using the Evaluate method. This method takes a single parameter of type IEnumerable<T> representing the collection on which the underlying query expression will be appled to. In this example, the GetEnvironment method of the Example class handles creating a Specification and applying it to the collect static collection of Environment entities.

public class Environment
{
    public string Name { get; set; }
    public string Description { get; set; }
}

public class EnvironmentByNameSpec : Specification<Environment>
{
    public EnvironmentByNameSpec(string name)
    {
        Query.Where(h => h.Name == name);
    }
}

public static class Example
{
    private static readonly Environment[] Environments = new Environment[]
    {
        new()
        {
            Name = "DEV",
            Description = "this application's development environment"
        },
        new()
        {
            Name = "QA",
            Description = "this application's QA environment"
        },
        new()
        {
            Name = "PROD",
            Description = "this application's production environment"
        }
    };

    public static Environment GetEnvironment(string name)
    {
        var specification = new EnvironmentByNameSpec(name);

        var environment = specification.Evaluate(Environments)
            .Single();

        return environment;
    }
}