在 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 管道是严格顺序的?
就您的目的而言,这里的 IQueryable
与 IEnumerable
没有什么不同,正如您所说,后者是纯顺序的。在您调用 Where()
之后,实际上没有原始 "collection".
的踪迹
现在,理论上您可以做您想做的事,但这需要滚动"your own LINQ"。 Preprocess()
可以 return 某种 PreprocessedEnumerable
,所有自定义运算符都将附加到它,最后的 ToList()
将对调用进行重新排序。
请看下面的代码:
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 管道是严格顺序的?
就您的目的而言,这里的 IQueryable
与 IEnumerable
没有什么不同,正如您所说,后者是纯顺序的。在您调用 Where()
之后,实际上没有原始 "collection".
现在,理论上您可以做您想做的事,但这需要滚动"your own LINQ"。 Preprocess()
可以 return 某种 PreprocessedEnumerable
,所有自定义运算符都将附加到它,最后的 ToList()
将对调用进行重新排序。