Skip to content

StyraInc/ucast-linq

Repository files navigation

Styra UCAST integration for LINQ

License NuGet Version

Important

The reference documentation for this library is available at https://styrainc.github.io/ucast-linq

Installation

Nuget

dotnet add package Styra.Ucast.Linq

Example Usage

Let's assume that we have a collection of random integers, and wish to filter them with a LINQ query using multiple criteria:

using System;
using System.Linq;

public record SimpleRecord(int Value);

var numbers = new int[] { -1523, 1894, -456, 789, -1002, 345, -1789, 567, 1234, -890, 123, -1456, 1678, -234, 567, -1890, 901, -345, 1567, -789 };
var collection = numbers.Select(n => new SimpleRecord(n)).ToList();
var results = collection.Where(x => x.Value >= 1500 || (x.Value < 400 && (x.Value > 0 || x.Value < -1500)))
                        .OrderBy(x => x.Value)
                        .ToList();

Console.WriteLine(string.Join("\n", results));
Output
SimpleRecord { Value = -1890 }
SimpleRecord { Value = -1789 }
SimpleRecord { Value = -1523 }
SimpleRecord { Value = 123 }
SimpleRecord { Value = 345 }
SimpleRecord { Value = 1567 }
SimpleRecord { Value = 1678 }
SimpleRecord { Value = 1894 }

Using this library, the same filters can be constructed dynamically using UCAST expressions (which can be deserialized from JSON):

using System;
using System.Linq;
using Styra.Ucast.Linq;

public record SimpleRecord(int Value);

var conditions = new UCASTNode { Type = "compound", Op = "or", Value = new List<UCASTNode>{
    new UCASTNode { Type = "field", Op = "ge", Field = "r.value", Value = 1500 },
    new UCASTNode { Type = "compound", Op = "and", Value = new List<UCASTNode>{
        new UCASTNode { Type = "field", Op = "lt", Field = "r.value", Value = 400 },
        new UCASTNode { Type = "compound", Op = "or", Value = new List<UCASTNode>{
            new UCASTNode { Type = "field", Op = "gt", Field = "r.value", Value = 0 },
            new UCASTNode { Type = "field", Op = "lt", Field = "r.value", Value = -1500 },
        } },
    } },
} };

var numbers = new int[] { -1523, 1894, -456, 789, -1002, 345, -1789, 567, 1234, -890, 123, -1456, 1678, -234, 567, -1890, 901, -345, 1567, -789 };
var collection = numbers.Select(n => new SimpleRecord(n)).ToList();
var results = collection.AsQueryable()
                        .ApplyUCASTFilter(conditions, QueryableExtensions.BuildDefaultMapperDictionary<SimpleRecord>("r"))
                        .OrderBy(x => x.Value)
                        .ToList();

Console.WriteLine(string.Join("\n", results));
Output
SimpleRecord { Value = -1890 }
SimpleRecord { Value = -1789 }
SimpleRecord { Value = -1523 }
SimpleRecord { Value = 123 }
SimpleRecord { Value = 345 }
SimpleRecord { Value = 1567 }
SimpleRecord { Value = 1678 }
SimpleRecord { Value = 1894 }

Community

For questions, discussions and announcements related to Styra products, services and open source projects, please join the Styra community on Slack!

About

UCAST integration for LINQ.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 2

  •  
  •