Class MaybeQueryableExtensions
- Namespace
- Trellis.EntityFrameworkCore
- Assembly
- Trellis.EntityFrameworkCore.dll
LINQ query extensions for Maybe<T> properties backed by generated nullable storage members.
These methods rewrite the expression tree to target the underlying _camelCase storage member
via Property<TProperty>(object, string), enabling EF Core to translate the query to SQL.
public static class MaybeQueryableExtensions
- Inheritance
-
MaybeQueryableExtensions
- Inherited Members
Remarks
Because the Trellis.EntityFrameworkCore.MaybeConvention ignores the Maybe<T> CLR property,
EF Core cannot translate direct LINQ references to it.
These extension methods provide a strongly-typed alternative to raw EF.Property calls.
// Instead of:
context.Customers.Where(c => EF.Property<PhoneNumber?>(c, "_phone") == null)
// Use:
context.Customers.WhereNone(c => c.Phone)
Methods
OrderByMaybeDescending<TEntity, TInner>(IQueryable<TEntity>, Expression<Func<TEntity, Maybe<TInner>>>)
Orders the query descending by the mapped storage field for the selected Maybe<T> property.
public static IOrderedQueryable<TEntity> OrderByMaybeDescending<TEntity, TInner>(this IQueryable<TEntity> source, Expression<Func<TEntity, Maybe<TInner>>> propertySelector) where TEntity : class where TInner : notnull
Parameters
sourceIQueryable<TEntity>The queryable source.
propertySelectorExpression<Func<TEntity, Maybe<TInner>>>An expression selecting the Maybe<T> property.
Returns
- IOrderedQueryable<TEntity>
An ordered queryable.
Type Parameters
TEntityThe entity type.
TInnerThe type wrapped in Maybe<T>.
OrderByMaybe<TEntity, TInner>(IQueryable<TEntity>, Expression<Func<TEntity, Maybe<TInner>>>)
Orders the query ascending by the mapped storage field for the selected Maybe<T> property.
public static IOrderedQueryable<TEntity> OrderByMaybe<TEntity, TInner>(this IQueryable<TEntity> source, Expression<Func<TEntity, Maybe<TInner>>> propertySelector) where TEntity : class where TInner : notnull
Parameters
sourceIQueryable<TEntity>The queryable source.
propertySelectorExpression<Func<TEntity, Maybe<TInner>>>An expression selecting the Maybe<T> property.
Returns
- IOrderedQueryable<TEntity>
An ordered queryable.
Type Parameters
TEntityThe entity type.
TInnerThe type wrapped in Maybe<T>.
ThenByMaybeDescending<TEntity, TInner>(IOrderedQueryable<TEntity>, Expression<Func<TEntity, Maybe<TInner>>>)
Adds a descending secondary ordering using the mapped storage field for the selected Maybe<T> property.
public static IOrderedQueryable<TEntity> ThenByMaybeDescending<TEntity, TInner>(this IOrderedQueryable<TEntity> source, Expression<Func<TEntity, Maybe<TInner>>> propertySelector) where TEntity : class where TInner : notnull
Parameters
sourceIOrderedQueryable<TEntity>The ordered queryable source.
propertySelectorExpression<Func<TEntity, Maybe<TInner>>>An expression selecting the Maybe<T> property.
Returns
- IOrderedQueryable<TEntity>
An ordered queryable.
Type Parameters
TEntityThe entity type.
TInnerThe type wrapped in Maybe<T>.
ThenByMaybe<TEntity, TInner>(IOrderedQueryable<TEntity>, Expression<Func<TEntity, Maybe<TInner>>>)
Adds an ascending secondary ordering using the mapped storage field for the selected Maybe<T> property.
public static IOrderedQueryable<TEntity> ThenByMaybe<TEntity, TInner>(this IOrderedQueryable<TEntity> source, Expression<Func<TEntity, Maybe<TInner>>> propertySelector) where TEntity : class where TInner : notnull
Parameters
sourceIOrderedQueryable<TEntity>The ordered queryable source.
propertySelectorExpression<Func<TEntity, Maybe<TInner>>>An expression selecting the Maybe<T> property.
Returns
- IOrderedQueryable<TEntity>
An ordered queryable.
Type Parameters
TEntityThe entity type.
TInnerThe type wrapped in Maybe<T>.
WhereEquals<TEntity, TInner>(IQueryable<TEntity>, Expression<Func<TEntity, Maybe<TInner>>>, TInner)
Filters the query to entities where the Maybe<T> property equals the
specified value (mapped storage field = value).
public static IQueryable<TEntity> WhereEquals<TEntity, TInner>(this IQueryable<TEntity> source, Expression<Func<TEntity, Maybe<TInner>>> propertySelector, TInner value) where TEntity : class where TInner : notnull
Parameters
sourceIQueryable<TEntity>The queryable source.
propertySelectorExpression<Func<TEntity, Maybe<TInner>>>An expression selecting the Maybe<T> property (e.g.,
c => c.Phone).valueTInnerThe value to compare against.
Returns
- IQueryable<TEntity>
A filtered queryable where the mapped storage field equals the value.
Type Parameters
TEntityThe entity type.
TInnerThe type wrapped in Maybe<T>.
Examples
var phone = PhoneNumber.Create("+15550100");
var matches = await context.Customers
.WhereEquals(c => c.Phone, phone)
.ToListAsync(ct);
WhereHasValue<TEntity, TInner>(IQueryable<TEntity>, Expression<Func<TEntity, Maybe<TInner>>>)
Filters the query to entities where the Maybe<T> property has a value (mapped storage field IS NOT NULL).
public static IQueryable<TEntity> WhereHasValue<TEntity, TInner>(this IQueryable<TEntity> source, Expression<Func<TEntity, Maybe<TInner>>> propertySelector) where TEntity : class where TInner : notnull
Parameters
sourceIQueryable<TEntity>The queryable source.
propertySelectorExpression<Func<TEntity, Maybe<TInner>>>An expression selecting the Maybe<T> property (e.g.,
c => c.Phone).
Returns
- IQueryable<TEntity>
A filtered queryable where the mapped storage field is NOT NULL.
Type Parameters
TEntityThe entity type.
TInnerThe type wrapped in Maybe<T>.
Examples
var customersWithPhone = await context.Customers
.WhereHasValue(c => c.Phone)
.ToListAsync(ct);
WhereHasValue<TEntity, TInner>(IQueryable<TEntity>, Expression<Func<TEntity, Maybe<TInner>>>, Expression<Func<TInner, bool>>)
Filters the query to entities where the Maybe<T> property has a value
and that value satisfies predicate.
public static IQueryable<TEntity> WhereHasValue<TEntity, TInner>(this IQueryable<TEntity> source, Expression<Func<TEntity, Maybe<TInner>>> propertySelector, Expression<Func<TInner, bool>> predicate) where TEntity : class where TInner : notnull
Parameters
sourceIQueryable<TEntity>The queryable source.
propertySelectorExpression<Func<TEntity, Maybe<TInner>>>An expression selecting the Maybe<T> property (e.g.,
o => o.SubmittedAt).predicateExpression<Func<TInner, bool>>An expression over the present value, not a compiled delegate.
Returns
- IQueryable<TEntity>
A filtered queryable excluding NULL storage values and applying the predicate.
Type Parameters
TEntityThe entity type.
TInnerThe type wrapped in Maybe<T>.
Examples
Find orders submitted before a cutoff date:
var cutoff = DateTime.UtcNow.AddDays(-7);
var overdueOrders = await context.Orders
.WhereHasValue(o => o.SubmittedAt, submittedAt => submittedAt < cutoff)
.ToListAsync(ct);
Remarks
The predicate is inlined against the mapped storage member without requiring
MaybeQueryInterceptor. C# checks the operators and methods used in the
predicate; the database provider must still translate them. Scalar value-object
Value access requires ScalarValueQueryInterceptor.
Translation failures propagate; there is no client-side fallback.
Even a predicate that always returns true excludes absent values.
WhereNone<TEntity, TInner>(IQueryable<TEntity>, Expression<Func<TEntity, Maybe<TInner>>>)
Filters the query to entities where the Maybe<T> property has no value (mapped storage field IS NULL).
public static IQueryable<TEntity> WhereNone<TEntity, TInner>(this IQueryable<TEntity> source, Expression<Func<TEntity, Maybe<TInner>>> propertySelector) where TEntity : class where TInner : notnull
Parameters
sourceIQueryable<TEntity>The queryable source.
propertySelectorExpression<Func<TEntity, Maybe<TInner>>>An expression selecting the Maybe<T> property (e.g.,
c => c.Phone).
Returns
- IQueryable<TEntity>
A filtered queryable where the mapped storage field is NULL.
Type Parameters
TEntityThe entity type.
TInnerThe type wrapped in Maybe<T>.
Examples
var customersWithoutPhone = await context.Customers
.WhereNone(c => c.Phone)
.ToListAsync(ct);