
SequelFilter is a C# library allowing objects to be filtered using a SQL like query language
Get the library via nuget:
Alternatively see the releases on GitHub:
The filtering grammar is designed to be SQL-like. You can reference fields or properties of objects in a C# style and use familiar dotted access.
Letβs start with an example. Considering this simple object:
public class World
{
    public IEnumerable<Country> Countries => new[]
    { 
        Country.US,
        Country.UK,
        Country.France
    };
    public RandomStatistics Statistics { get; }
        = new RandomStatistics();
}
public class RandomStatistics
{
    public long Population => 8007821437;
    public long Websites => 1630322759;
    public long FieldOfDreams = 201;
}
Given the object World the filter Statistics.FieldOfDreams == 201 would return true. So would the filter Statistics.Population > 1000000. As would the filter Statistics.FieldOfDreams == 201 AND Statistics.Population > 1000000.
The following language elements are available:
| Name | Function | 
|---|---|
| Comparison | Allows values to be compared to eachother. Operators are =,==,!=,<>,>,>=,<,<=. | 
| Binary | Allows two results to be combined using ANDorOR(or&&or||). More complex structures can be facilitated through the use of parentheses. | 
| BETWEEN | Allows checking whether a value is between a lower and upper bound. Can also be stated as NOT BETWEEN. | 
| IN | Allows checking whether a value is in a specified list of values. | 
| NOT | Allows an expression to be negated. | 
| Field Reference | Access to a member with dotted syntax (e.g. Statistics.Population). | 
| Enumerable | Allows running a comparison against the elements in an IEnumerable- with HAS_ANY, HAS_SINGLE and HAS_NONE being available | 
| IS NULL | Allows checking if a value is null. Can also be stated as IS NOT NULL. | 
| LIKE | Allows checking if a value matches a SQL LIKE pattern. Patterns can include character ranges [a-z], single character wildcards?and multiple character wildcards%. Can also be stated as NOT LIKE. | 
Some good examples of usage can be found in the unit tests.
You can combine any of the individual language elements to create more complex filters. Here are some examples:
Statistics.FieldOfDreams == 201 AND Statistics.Population > 1000000
Statistics.FieldOfDreams == 201 OR (Statistics.Population > 1000000 AND Statistics.Websites > 5000)
Statistics.FieldOfDreams == 201 OR Statistics.Population > 1000000 OR Statistics.Websites > 5000
Field selectors just use a comma separated list of field reference elements. The idea of this is to allow natural input to select a list of fields. An example would be Statistics.Population, Statistics.Websites. The field selectors would create a list of FieldSelector instances which contain the name of the field and a delegate to extract the value given an IFieldReferenceResolver instance.