ZeroSharp

Robert Anderson's ones and zeros

Fluent Queries With DevExpress XPO - Intro

| Comments

There are many ways to perform queries with XPO.

You can do this:

1
Session.FindObject<Contact>(new BinaryOperator("Name", "Elvis"));

or this

1
Session.FindObject<Contact>(CriteriaOperator.Parse("Name = 'Elvis'"));

Another way to use the simplified criteria syntax, and with the Xpo_EasyFields CodeRush plugin. Then you can do:

1
Session.FindObject<Contact>(Customer.Fields.Name == "Elvis");

For each of the above, you can optionally query within the transaction by passing in the PersistentCriteriaEvaluationBehavior.InTransaction parameter.

Or we can use LINQ via XPQuery<T>.TransformExpression().

1
2
3
Session.FindObject<Contact>(
    XPQuery<Contact>.TransformExpression(Session, c => c.Name == "Elvis")
    );

All of these methods are powerful, but the power comes at a cost. The syntax is neither elegant nor particularly clear and as a result it is not very practical to maintain or test.

A Fluent Interface for XPO

How about if we could do the following?

1
2
3
4
var customer = Session
                .Query()
                  .Contacts
                    .ByName("Elvis");

Or, for a more elaborate example:

1
2
3
4
5
6
7
8
9
10
11
12
var customer = Session
                 .Query()
                 .InTransaction
                    .Contacts
                      .ByPosition("Developer")
                        .ThatHave
                          .NoPhoto()
                        .And
                          .TasksInProgress()
                        .And
                          .TasksWith(Priority.High)
                 .FirstOrDefault();

In the next post I’ll show how to put the fluent interface code together.

Comments