繁体   English   中英

LINQ知道如何优化“查询”吗?

[英]Does LINQ know how to optimize “queries”?

假设我做了类似的事情

 var Ordered = MyList.OrderBy(x => x.prop1).ThenBy(x => x.prop2); 

MyList.OrderBy(x => x.prop1)返回已过滤的列表,然后通过ThenBy(x => x.prop2)进一步过滤该列表? 换句话说,它是否相当于

var OrderedByProp1 = MyList.OrderBy(x => x.prop1);
var Ordered = OrderedByProp1.OrderBy(x => x.prop2);

???

因为很明显可以通过使用比较器运行排序算法来优化它:

var Ordered = MyList.Sort( (x,y) => x.prop1 != y.prop1 ? x.prop1 < y.prop1 : ( x.prop2 < y.prop2 ) );

如果它确实进行了某种优化,并且在过程中没有返回中间列表,那么它如何知道如何做到这一点? 你如何编写一个优化方法链的类? 没有意义。

MyList.OrderBy(x => x.prop1)返回已过滤的列表

否.LINQ方法(至少通常)返回查询 ,而不是执行这些查询的结果

OrderBy只返回一个对象,当你向它询问一个项目时,它会返回给定特定排序的集合中的第一个项目。 但是直到你实际问它结果它没有做任何事情

请注意,通过查看OrderBy返回的内容,您还可以了解正在发生的事情。 它返回IOrderedEnumerable<T> 该接口有一个方法CreateOrderedEnumerable ,其中:

根据密钥对IOrderedEnumerable的元素执行后续排序。

该方法是ThenBy用来表示存在后续排序的方法。

这意味着您需要在结果集中生成单个项目之前 ,从OrderBy和所有ThenBy调用构建所有要使用的比较器。

关于究竟如何去创造这种行为更多的细节,请参见乔恩斯基特对这个问题的博客系列

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM