C# LinqToSql中的子查询是否保证与其父查询的顺序相同?
假设我有一个带有DateTime字段和int字段的表,并执行如下查询: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); 我的直觉告诉我它
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()调用)