任何重要的LINQ方法的顺序?

Her*_*des 11 .net c# linq linq-to-sql

只是想知道,添加LINQ方法的顺序是否重要?

例如.

using(MyDataContext context = new MyDataContext())
{
   var user = context.Users
                     .Where(u => u.UserName.StartsWith("t"))
                     .OrderByDescending(u => u.CreatedDate)
                     .FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)

完全一样吗?

using(MyDataContext context = new MyDataContext())
{
   var user = context.Users
                     .OrderByDescending(u => u.CreatedDate)
                     .Where(u => u.UserName.StartsWith("t"))
                     .FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)

当然我可以逐个测试所有方法,但我想对逻辑有一些大概的了解.

所以:

  • 除了像FirstOrDefault(),ToList()和其他真正触发执行的方法之外,在LINQ语句中使用某种类型的顺序是否重要?

再次感谢!

Jon*_*eet 10

在LINQ to SQL中,我希望这两个查询是相同的 - 至少,它们应该以相同的查询计划结束,即使不是完全相同的SQL.

在LINQ to Objects中,它们的行为会有很大不同.想象一下,你有一百万用户,但只有两个用户名以"t"开头.在第一种形式中,您将过滤然后对这两个用户进行排序...在第二种形式中,它需要在开始过滤之前对所有内容进行排序.

当然还有其他情况下,顺序也很重要 - 特别是,如果你有Select一半的顺序,然后一个Where条款,那么你将过滤不同的事情.想象一下:

var query = Enumerable.Range(-20, 30)
                      .Select(x => -x)
                      .Where(x => x > 5);
Run Code Online (Sandbox Code Playgroud)

VS

var query = Enumerable.Range(-20, 30)
                      .Where(x => x > 5)
                      .Select(x => -x);
Run Code Online (Sandbox Code Playgroud)

在第一个例子中,结果将是"20,19,18,... 6",而在第二个查询中,结果将是"-6,-7,-8,-9,-10".千差万别!