C# 使用LinQ语句的正确顺序是什么?
我经常使用LinQ语句来查询EF、过滤数据或搜索我的数据集合,但我一直怀疑哪条语句是第一条要编写的语句 假设我们有一个类似的查询:C# 使用LinQ语句的正确顺序是什么?,c#,linq,C#,Linq,我经常使用LinQ语句来查询EF、过滤数据或搜索我的数据集合,但我一直怀疑哪条语句是第一条要编写的语句 假设我们有一个类似的查询: var result = Data.Where(x => x.Text.StartsWith("ABC")).OrderBy(x => x.Id).Select(x => x.Text).Take(5).ToList(); 即使语句的顺序不同,也可以使用相同的查询,例如: var result = Data.OrderBy(x => x.I
var result = Data.Where(x => x.Text.StartsWith("ABC")).OrderBy(x => x.Id).Select(x => x.Text).Take(5).ToList();
即使语句的顺序不同,也可以使用相同的查询,例如:
var result = Data.OrderBy(x => x.Id).Select(x => x.Text).Where(x => x.Text.StartsWith("ABC")).Take(5).ToList();
我知道有某些语句确实会修改预期结果,但我怀疑的是那些没有修改的语句,如前一个示例所示。是否为此制定了特定的订单或任何良好实践指南?它将为您提供不同的结果。假设您有以下ID:
6,5,4,3,2,1
第一句话会告诉你
1,2,3,4,5
第二个呢
2,3,4,5,6
我假设所有具有以下ID的对象都以ABC开头
编辑:我想我没有正确回答这个问题。是的,有区别。在第一个示例中,您只对5个元素进行排序,而在第二个示例中,您对所有元素进行排序,这肯定比第一个要慢
是否为此制定了特定的订单或任何良好实践指南
不,因为顺序决定结果是什么。在SQL(一种声明性语言)中,SELECT总是位于WHERE之前,GROUPBY之前,等等,解析引擎将其转换为执行计划,以优化器认为最好的顺序执行
因此,选择、排序、分组都发生在FROM子句指定的数据上,所以顺序并不重要
方法中的C是一种过程语言,这意味着语句将按照您提供的顺序执行
选择“然后排序”时,排序将应用于选择,这意味着如果选择字段子集或投影到不同的字段,则排序将应用于投影。如果进行排序,然后选择,则排序将应用于原始数据,然后投影将应用于已排序的数据
在第二个已编辑的示例中,查询似乎已中断,因为您正在指定将从投影中丢失的属性:
var result = Data.OrderBy(x => x.Id).Select(x => x.Text).Where(x => x.Text.StartsWith("ABC")).Take(5).ToList();
^
此时,您正在投影的只是文本属性,我假设为sia string,因此后续的Select正在处理一组字符串,而这些字符串没有要过滤的文本属性
当然,您可以直接更改筛选字符串的位置,但它说明了改变命令顺序可能会对查询产生灾难性影响。这可能没有什么区别,正如您试图说明的,例如,排序然后过滤在逻辑上应该等同于过滤然后排序,假设一个不影响另一个,并且没有最佳实践来说明哪一个应该先进行,因此,如果有正确答案,将根据具体情况确定。假设的重复是关于性能的,这个问题既没有提到也没有暗示它与性能相关。除非x.Text也有Id和Text属性,否则两个查询都不起作用。对于EF,如果查询在逻辑上是等价的,并且能够很好地转换为SQL,并且优化器的工作做得很好,那么它们应该会产生相同的查询计划。稍微忽略一点这个例子,核心问题是是否有一个关于句子使用的良好实践的顺序或指南,以及为什么您是正确的,我认为这个例子无助于说明问题的目的。我会修改它。这是我一直在等待的答案,通过你的例子,我可以在造句时给我更多的想法。非常感谢你的朋友