Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LinQ语句的正确顺序是什么?_C#_Linq - Fatal编程技术网

C# 使用LinQ语句的正确顺序是什么?

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

我经常使用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.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,并且优化器的工作做得很好,那么它们应该会产生相同的查询计划。稍微忽略一点这个例子,核心问题是是否有一个关于句子使用的良好实践的顺序或指南,以及为什么您是正确的,我认为这个例子无助于说明问题的目的。我会修改它。这是我一直在等待的答案,通过你的例子,我可以在造句时给我更多的想法。非常感谢你的朋友