Fields Queries

Last updated: June 13th, 2020

Fields Queries

Syntax

Selecting fields:

field1,field2,field3

Selecting nested fields:

field1{field2,field3}

Select all fields, but only few in nested:

*,field2{field3}

Usage

Using these strong type classes in example:
public class Model
{
    public int Field1 { get; set; }
    public Nested Field2 { get; set; }

    public class Nested
    {
        public int Field3 { get; set; }
    }
}
Use a parser with interpreter to start going:
// Parsing
var parser = new FieldsQueryParser();
IEnumerable<FieldToken> result = parser.Parse("field1,field2{field3}");

// Or building tokens manually with strong type!
var builder = new FieldsQueryBuilder<Model>();
IEnumerable<FieldToken> builderResult = builder
    .Field(x => x.Field1)
    .Nested(x => x.Field2, n => n.Field(f => f.Field3))
    .Build();

// Interpreting
var interpreter = new FieldsQueryInterpreter(result);
interpreter.Includes("field1"); // returns if field1 should be included

var nested = interpreter.Visit("field2"); // returns a nested interpreter
nested.Includes("field3"); // returns if you need to include field2.field3 

// Interpreter could be wrapped to support strong type
var strongTypeInterpreter = new FieldsQueryInterpreter<Model>(interpreter);
strongTypeInterpreter.Includes(x => x.Field1);

var strongTypeNested = strongTypeInterpreter.Visit(x => x.Field2);
strongTypeNested.Includes(x => x.Field3);

// Serialize back into string query
var serializer = new FieldsQuerySerializer();
string query = serializer.Serialize(result); // field1,field2{field3}