LinqBuilder 3.1.0
dotnet add package LinqBuilder --version 3.1.0
NuGet\Install-Package LinqBuilder -Version 3.1.0
<PackageReference Include="LinqBuilder" Version="3.1.0" />
paket add LinqBuilder --version 3.1.0
#r "nuget: LinqBuilder, 3.1.0"
// Install LinqBuilder as a Cake Addin #addin nuget:?package=LinqBuilder&version=3.1.0 // Install LinqBuilder as a Cake Tool #tool nuget:?package=LinqBuilder&version=3.1.0
LinqBuilder
Table of Contents
LinqBuilder Specifications
Usage
Specifications can be constructed in three different ways.
By extending Specification:
public class FirstnameIsFoo : Specification<Person>
{
public override Expression<Func<Person, bool>> AsExpression()
{
return person => person.Firstname == "Foo";
}
}
ISpecification<Person> firstnameIsFoo = new FirstnameIsFoo();
By extending DynamicSpecification:
public class FirstnameIs : DynamicSpecification<Person, string>
{
public override Expression<Func<Person, bool>> AsExpression()
{
return person => person.Firstname == Value;
}
}
ISpecification<Person> firstnameIsFoo = new FirstnameIs().Set("Foo");
By extending MultiSpecification:
public class FirstnameIsFoo : MultiSpecification<Person, OtherPerson>
{
public override Expression<Func<Person, bool>> AsExpressionForEntity1()
{
return person => person.Firstname == "Foo";
}
public override Expression<Func<OtherPerson, bool>> AsExpressionForEntity2()
{
return person => person.Firstname == "Foo";
}
}
ISpecification<Person> firstnameIsFoo = new FirstnameIsFoo(); // First generic is default
ISpecification<Person> firstnameIsFoo = new FirstnameIsFoo().For<Person>();
ISpecification<OtherPerson> firstnameIsFoo = new FirstnameIsFoo().For<OtherPerson>();
By static New method:
ISpecification<Person> firstnameIsFoo = Specification<Person>.New(p => p.Firstname == "Foo");
// Or by alias
ISpecification<Person> firstnameIsFoo = Spec<Person>.New(p => p.Firstname == "Foo");
Example
var collection = new List<Person>() { ... };
ISpecification<Person> firstnameIsFoo = Spec<Person>.New(p => p.Firstname == "Foo");
ISpecification<Person> firstnameIsBar = Spec<Person>.New(p => p.Firstname == "Bar");
ISpecification<Entity> specification = firstnameIsFoo.Or(firstnameIsBar);
var result = collection.ExeSpec(specification).ToList();
// result = Collection items satisfied by specification
The extension ExeSpec
allows all types of ISpecification
to be executed on IQueryable
and IEnumerable
.
Methods
ISpecification<Entity> specification = Spec<Entity>.All(
new SomeSpecification(),
new SomeOtherSpecification(),
...
);
ISpecification<Entity> specification = Spec<Entity>.None(
new SomeSpecification(),
new SomeOtherSpecification(),
...
);
ISpecification<Entity> specification = Spec<Entity>.Any(
new SomeSpecification(),
new SomeOtherSpecification(),
...
);
Extensions
ISpecification<TEntity> And<TEntity>(this ISpecification<TEntity> left, ISpecification<TEntity> right);
ISpecification<TEntity> Or<TEntity>(this ISpecification<TEntity> left, ISpecification<TEntity> right);
ISpecification<TEntity> Not<TEntity>(this ISpecification<TEntity> specification);
bool IsSatisfiedBy<TEntity>(this ISpecification<TEntity> specification, TEntity entity);
ISpecification<TEntity> Clone<TEntity>(this ISpecification<TEntity> specification);
LinqBuilder also extends the following extensions to support ISpecification
on IQueryable
and IEnumerable
.
IEnumerable<Entity> collection = collection.Where(specification);
bool result = collection.Any(specification);
bool result = collection.All(specification);
int result = collection.Count(specification);
Entity result = collection.First(specification);
Entity result = collection.FirstOrDefault(specification);
Entity result = collection.Single(specification);
Entity result = collection.SingleOrDefault(specification);
LinqBuilder OrderSpecifications
Usage
Order specifications can be constructed in almost the same way as regular specifications.
By extending OrderSpecification:
public class FirstnameDescending : OrderSpecification<Person, string>
{
public DescNumberOrderSpecification() : base(Sort.Descending) { }
public override Expression<Func<Person, string>> AsExpression()
{
return person => person.Firstname;
}
}
ISpecification<Person> firstnameDescending = new FirstnameDescending();
By static New method:
ISpecification<Person> firstnameDescending = OrderSpecification<Person, string>.New(p => p.Firstname, Sort.Descending);
// Or by alias
ISpecification<Person> firstnameDescending = OrderSpec<Person, string>.New(p => p.Firstname, Sort.Descending);
Example
var collection = new List<Person>() { ... };
ISpecification<Person> firstnameDescending = OrderSpec<Person, string>.New(p => p.Firstname, Sort.Descending);
ISpecification<Person> lastnameDescending = OrderSpec<Person, string>.New(p => p.Lastname, Sort.Descending);
ISpecification<Person> specification = firstnameDescending.ThenBy(lastnameDescending);
var result = collection.ExeSpec(specification).ToList();
// result = Collection ordered by descending number, then by other number
Methods
ISpecification<Person> specification = OrderSpec<Person, string>.New(p => p.Firstname)
.Take(10);
ISpecification<Person> specification = OrderSpec<Person, string>.New(p => p.Firstname)
.Skip(5);
ISpecification<Person> specification = OrderSpec<Person, string>.New(p => p.Firstname)
.Paginate(2, 10); // Equals .Skip((2 - 1) * 10).Take(10)
Extensions
IOrderedEnumerable<Entity> collection = collection
.OrderBy(specification);
.ThenBy(otherSpecification);
Order specifications can also be chained with regular LinqBuilder specifications.
ISpecification<Person> firstnameIsFoo = Spec<Person>.New(p => p.Firstname == "Foo");
ISpecification<Person> firstnameAscending = OrderSpec<Person, string>.New(p => p.Firstname);
ISpecification<Entity> specification = firstnameIsFoo.OrderBy(firstnameAscending);
Chained OrderSpecification
's can also be attatched to a specification later.
ISpecification<Person> firstnameIsFoo = Spec<Person>.New(p => p.Firstname == "Foo");
ISpecification<Person> firstnameAscending = OrderSpec<Person, string>.New(p => p.Firstname);
ISpecification<Person> lastnameAscending = OrderSpec<Person, string>.New(p => p.Firstname);
ISpecification<Person> orderSpecification = firstnameAscending.ThenBy(lastnameAscending);
ISpecification<Person> specification = firstnameIsFoo.UseOrdering(orderSpecification);
The following extensions will help to check what kind of ordering is applied.
ISpecification<Person> firstnameIsFoo = Spec<Person>.New(p => p.Firstname == "Foo");
ISpecification<Person> firstnameAscending = OrderSpec<Person, string>.New(p => p.Firstname);
firstnameIsFoo.IsOrdered(); // Returns false
ISpecification<Person> specification = firstnameIsFoo.OrderBy(firstnameAscending);
specification.IsOrdered(); // Returns true
ISpecification<Person> specification = Spec<Person>.New(p => p.Firstname == "Foo");
specification.HasSkip(); // Returns false
ISpecification<Person> specification = specification.Skip(10);
specification.HasSkip(); // Returns true
ISpecification<Person> specification = Spec<Person>.New(p => p.Firstname == "Foo");
specification.HasTake(); // Returns false
ISpecification<Person> specification = specification.Take(10);
specification.HasTake(); // Returns true
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- LinqKit.Core (>= 1.2.5)
-
net6.0
- LinqKit.Core (>= 1.2.5)
-
net7.0
- LinqKit.Core (>= 1.2.5)
-
net8.0
- LinqKit.Core (>= 1.2.5)
NuGet packages (4)
Showing the top 4 NuGet packages that depend on LinqBuilder:
Package | Downloads |
---|---|
LinqBuilder.EFCore
Entity Framework Core extensions. Enables most async methods to use ISpecification. |
|
LinqBuilder.EF6
Entity Framework 6 extensions. Enables most async methods to use ISpecification. |
|
LinqBuilder.EFCore.AutoMapper
Extensions for querying EF Core with AutoMapper projections. |
|
LinqBuilder.EF6.AutoMapper
Extensions for querying EF 6 with AutoMapper projections. |
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
3.1.0 | 12,396 | 5/5/2024 |
3.0.1 | 17,297 | 10/18/2023 |
3.0.0 | 194 | 10/17/2023 |
2.1.2 | 29,950 | 4/14/2022 |
2.1.1 | 865 | 4/13/2022 |
2.1.0 | 873 | 4/13/2022 |
2.0.0 | 1,572 | 1/19/2021 |
1.0.1 | 7,678 | 11/3/2020 |
1.0.0 | 814 | 11/3/2020 |
0.16.1 | 38,202 | 8/29/2019 |
0.15.0 | 4,532 | 12/4/2018 |
0.14.0 | 761 | 12/3/2018 |
0.13.0 | 4,326 | 9/17/2018 |
0.12.1 | 1,231 | 7/18/2018 |
0.12.0 | 869 | 7/18/2018 |
0.11.1 | 874 | 7/18/2018 |
0.11.0 | 1,218 | 6/24/2018 |
0.10.0 | 1,276 | 6/24/2018 |
0.9.1 | 1,328 | 6/11/2018 |
0.9.0 | 1,342 | 6/7/2018 |
0.8.2 | 1,359 | 6/5/2018 |