Tôi đã giải quyết vấn đề này bằng một phương thức mở rộng để cho phép LINQ được bật có điều kiện ở giữa một biểu thức trôi chảy. Điều này loại bỏ sự cần thiết phải chia nhỏ biểu thức vớiif
câu lệnh.
.If()
phương thức mở rộng:
public static IQueryable<TSource> If<TSource>(
this IQueryable<TSource> source,
bool condition,
Func<IQueryable<TSource>, IQueryable<TSource>> branch)
{
return condition ? branch(source) : source;
}
Điều này cho phép bạn làm điều này:
return context.Logs
.If(filterBySeverity, q => q.Where(p => p.Severity == severity))
.If(filterByUser, q => q.Where(p => p.User == user))
.ToList();
Đây cũng là một IEnumerable<T>
phiên bản sẽ xử lý hầu hết các biểu thức LINQ khác:
public static IEnumerable<TSource> If<TSource>(
this IEnumerable<TSource> source,
bool condition,
Func<IEnumerable<TSource>, IEnumerable<TSource>> branch)
{
return condition ? branch(source) : source;
}