J'ai résolu cela avec une méthode d'extension pour permettre à LINQ d'être activé conditionnellement au milieu d'une expression fluide. Cela supprime le besoin de fractionner l'expression avec des if
instructions.
.If()
méthode d'extension:
public static IQueryable<TSource> If<TSource>(
this IQueryable<TSource> source,
bool condition,
Func<IQueryable<TSource>, IQueryable<TSource>> branch)
{
return condition ? branch(source) : source;
}
Cela vous permet de faire ceci:
return context.Logs
.If(filterBySeverity, q => q.Where(p => p.Severity == severity))
.If(filterByUser, q => q.Where(p => p.User == user))
.ToList();
Voici également une IEnumerable<T>
version qui gérera la plupart des autres expressions LINQ:
public static IEnumerable<TSource> If<TSource>(
this IEnumerable<TSource> source,
bool condition,
Func<IEnumerable<TSource>, IEnumerable<TSource>> branch)
{
return condition ? branch(source) : source;
}