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 AND or OR (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.