我试图了解在Where子句之前使用OrderBy子句是否有任何性能损失,如下所示:
List<string> names = new List<string> { //... };
var ns = names.OrderBy(n => n).Where(n => n.Length == 5);
Run Code Online (Sandbox Code Playgroud)
或者编译器会重新排列指令,以便在OrderBy子句之前执行Where子句吗?
我读了这个问题的答案,解释了LINQ to objects方法的顺序有所不同.我的问题是为什么?
如果我编写LINQ to SQL查询,那么LINQ方法的顺序无关紧要 - projections例如:
session.Query<Person>().OrderBy(x => x.Id)
.Where(x => x.Name == "gdoron")
.ToList();
Run Code Online (Sandbox Code Playgroud)
表达式树将转换为合理的SQL,如下所示:
SELECT *
FROM Persons
WHERE Name = 'gdoron'
ORDER BY Id;
Run Code Online (Sandbox Code Playgroud)
当我运行查询时,无论方法的顺序多么奇怪,SQL查询都会根据表达式树构建.
为什么它不起作用LINQ to objects?
当我枚举一个IQueryable时,所有的投影都可以放在一个合理的顺序中(例如,在Where之后的Order By)就像数据库优化器那样.
我的List记忆力很大,来自一个大约20岁的班级properties.
我想基于一个过滤此列表property,对于特定任务,我只需要一个列表property.所以我的查询是这样的:
data.Select(x => x.field).Where(x => x == "desired value").ToList()
Run Code Online (Sandbox Code Playgroud)
哪一个让我有更好的表现,Select先使用或使用Where?
data.Where(x => x.field == "desired value").Select(x => x.field).ToList()
Run Code Online (Sandbox Code Playgroud)
如果这与data type我将数据保存在内存或字段类型中有关,请告诉我.请注意,我也需要这些对象用于其他任务,因此我无法在首先过滤它们并将它们加载到内存之前.