public static class MyPipeline { public static IEnumerable<int> Step1(this IEnumerable<int> data) { //There is no point in verifying if data exists at the cost of having to access the entire data set //We can make sure that we use null coalescent operators in the entire pipeline, or other better practices. Of course //this is always a design choice that should be evaluated for each context and bussiness requirements. return data; } public static IEnumerable<int> Step2(this IEnumerable<int> data, int filterBottomThreshold) { return data?.Where(t => t > filterBottomThreshold); //forces query evaluation } public static IEnumerable<int> Step3(this IEnumerable<int> data, int filterTopThreshold) { return data?.Where(t => t < filterTopThreshold); //forces query evaluation } public static IEnumerable<int> Step4(this IEnumerable<int> data, int page) { var pageSize = 1000; return data?.Skip(pageSize * page).Take(pageSize); } }