Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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# LinqToSql中的子查询是否保证与其父查询的顺序相同?_C#_.net_Linq_Linq To Sql - Fatal编程技术网

C# LinqToSql中的子查询是否保证与其父查询的顺序相同?

C# LinqToSql中的子查询是否保证与其父查询的顺序相同?,c#,.net,linq,linq-to-sql,C#,.net,Linq,Linq To Sql,假设我有一个带有DateTime字段和int字段的表,并执行如下查询: var query = context.tblSomeTable.Where(s=>s.Name == "Hello World").OrderBy(s=>s.SignUpDate); 如果我对结果执行两个子查询,它们是否仍按日期排序 var sub1 = query.Where(s=>s.Id = 5); var sub2 = query.Where(s=>s.Id = 8); 我的直觉告诉我它

假设我有一个带有DateTime字段和int字段的表,并执行如下查询:

var query = context.tblSomeTable.Where(s=>s.Name == "Hello World").OrderBy(s=>s.SignUpDate);
如果我对结果执行两个子查询,它们是否仍按日期排序

var sub1 = query.Where(s=>s.Id = 5);
var sub2 = query.Where(s=>s.Id = 8);

我的直觉告诉我它们仍然是有序的,但是如果原始查询已经被迭代/执行了,这有关系吗?

是的,它仍然保持相同的顺序。在您的情况下,第一个查询将是IOrderedQueryable,当您进一步查询时,sub1和sub2也将是IOrderedQueryable,因此将保持排序。

是的,但是,说它们“仍然”排序是错误的。最后,他们被订购了一次

关于LinqtoSql需要注意的重要一点是,它只构建一个查询,在使用它时执行该查询。在您展示的示例中,您还没有实际使用查询。您刚刚构建了两个大查询

它们都将生成以下SQL语句:

select * from tblSomeTable s
where s.Name = 'Hello World' and s.ID == @p1
order by s.SignUpDate
使用sub1时,@p1将设置为5


(实际上,“Hello World”也将作为参数传递…

使用SQL Server Profiler很容易测试。在代码中创建LINQ查询的地方放一个断点,然后在观察分析器的同时逐行检查每一行。您将确切地知道查询何时到达数据库。这对于调试查询也很有用,因为您可以看到它们并从分析器中获取它们。文档中是否有任何内容表明order By子句将被推回末尾?鉴于L2S通常试图做“有意义的事情”,我认为应该这样做,但如果没有说明,不要依赖它,并将“order by”移到末尾……SQL语句只执行一次——当实际使用查询时(例如在foreach语句中,或通过.ToList()调用)