在 LINQ to objects 中预处理 IQueryable<T> 中的每个项目

Pre-processing every item in an IQueryable<T> in LINQ to objects

请看下面的代码:

var list = new List<MyClass>();
...
var selection = list
    .Preprocess()
    .Where(x => x.MyProperty = 42)
    .ToList();

我想以这样的方式实现 Preprocess,它可以处理后面的谓词选择的每个项目。因此,如果 list 包含数千个对象,我不希望 Preprocess 处理所有对象,而只处理那些由 Where 子句选择的对象。

我知道这听起来将 Preprocess 移动到查询的末尾会更好,但我有这样做的理由。

IQueryable<T>可以吗?或者它的行为是否像 IEnumerable,其中整个 LINQ-to-objects 管道是严格顺序的?

就您的目的而言,这里的 IQueryableIEnumerable 没有什么不同,正如您所说,后者是纯顺序的。在您调用 Where() 之后,实际上没有原始 "collection".

的踪迹

现在,理论上您可以做您想做的事,但这需要滚动"your own LINQ"。 Preprocess() 可以 return 某种 PreprocessedEnumerable,所有自定义运算符都将附加到它,最后的 ToList() 将对调用进行重新排序。