Я решил эту проблему с помощью метода расширения, позволяющего условно включить LINQ в середине беглого выражения. Это устраняет необходимость разбивать выражение с помощью if
операторов.
.If()
метод расширения:
public static IQueryable<TSource> If<TSource>(
this IQueryable<TSource> source,
bool condition,
Func<IQueryable<TSource>, IQueryable<TSource>> branch)
{
return condition ? source : branch(source);
}
Это позволяет вам сделать это:
return context.Logs
.If(filterBySeverity, q => q.Where(p => p.Severity == severity))
.If(filterByUser, q => q.Where(p => p.User == user))
.ToList();
Вот также версия IEnumerable<T>
, которая будет обрабатывать большинство других выражений LINQ:
public static IEnumerable<TSource> If<TSource>(
this IEnumerable<TSource> source,
bool condition,
Func<IEnumerable<TSource>, IEnumerable<TSource>> branch)
{
return condition ? source : branch(source);
}