The Sharp Factory
Esc
↑ ↓ to moveEnter to open
Query Composition / Complex Expressions

Complex Expressions

Group conditions in parentheses to build any filter you need.

On this page

What Are Complex Expressions?#

Complex Expressions are two or more Conditions grouped together to produce a single boolean result.

When you are crafting your Query instance you chain together one or more conditions.

But you might want to group some of those conditions to be evaluated together. For example the following seudo-code "select all Customers where Balance > 0 or (CreatedDate = today and (status = "new" or status = "inactive"))"

With a simple chain of And, Or we cannot achieve this meaning; this expression.

That is where Complex Expressions come into play in The Sharp Factory Framework.

Complex Expressions And Query#

To start an expression add .Where() or Or() to a Query instance using the overload that takes a delegate.

The following C# code sample shows how to achieve the expression "select all Customers where Balance > 0 or (CreatedDate = today and (status = "new" or status = "inactive"))"

Fluent Syntax#

C#
// create an instance of the Repository Container// remember this can be a singleton if you// declare it early on and reuse it for the// lifetime of your applicationvar repo = new RepositoryContainer();// create an instance of Query and// specify the entity's property containervar query = new Query<CustomerProperty>()    .BeginPredicate()    .Where(CustomerProperty.Balance).GreaterThan(0)    .Or((exp)=>    {        exp        .Where(CustomerProperty.CreatedDate).EqualsDate(DateTime.Now)        .Where((exp2) =>        {            exp2            .Where(CustomerProperty.Status).Equals("new")            .Or(CustomerProperty.Status).Equals("inactive");        });    })    .EndPredicate();// pass the query to one of the repository methods// in this case the ToList on the Customer repositoryvar result = repo.AppDb.Sales.Customer.ToList(query);

Builder Syntax#

C#
// create an instance of the Repository Container// remember this can be a singleton if you// declare it early on and reuse it for the// lifetime of your applicationvar repo = new RepositoryContainer();// create an instance of Query and// specify the entity's property containervar query = new Query<CustomerProperty>()    .Builder((builder) =>    {        builder        .Predicate((predicate) =>        {            predicate            .Where(CustomerProperty.Balance).GreaterThan(0)            .Or((exp)=>            {                exp                .Where(CustomerProperty.CreatedDate).EqualsDate(DateTime.Now)                .Where((exp2) =>                {                    exp2                    .Where(CustomerProperty.Status).Equals("new")                    .Or(CustomerProperty.Status).Equals("inactive");                });            });        });    });// pass the query to one of the repository methods// in this case the ToList on the Customer repositoryvar result = repo.AppDb.Sales.Customer.ToList(query);

The examples above are equivalent. The only difference is the syntax.