C# Where子句和Join的LINQ顺序

C# Where子句和Join的LINQ顺序,c#,.net,linq,join,where,C#,.net,Linq,Join,Where,以下各项之间是否存在性能差异: ctx .Students .Join( ctx.Countries, q => q.CountryId, q => q.CountryId, (c,s) => new { c,s }) .Where(q => q.c.CountryName= "USA") .Select(q => q.s.StudentName) .ToList(); 以及: 如

以下各项之间是否存在性能差异:

ctx
   .Students
   .Join(
      ctx.Countries, 
      q => q.CountryId, 
      q => q.CountryId, 
      (c,s) => new { c,s })
   .Where(q => q.c.CountryName= "USA")
   .Select(q => q.s.StudentName)
   .ToList();
以及:


如果是这样的话,哪个查询更可取?

一般规则是“左过滤”,意思是先过滤。不过,对于像C#这样的编译语言,您真的应该对其进行测试。抛出一些时间戳,看看执行大型查询需要多长时间


原因是编译器经常会为您优化代码。实际运行的代码不是您编写的代码,因此请编写可读性代码,让编译器进行优化,然后测试性能。如果性能不佳或需要改进,则进行调整。

这是在内存中执行的Linq还是生成sql查询的Linq?您是否运行了这两个案例?@Fabio,LINQ生成SQL查询。但如果它在内存中执行,答案会有什么不同?是的,我确实运行了这两种情况。如果您同时运行这两种情况,请检查生成的SQL查询或使用SQL profiler获取性能详细信息,或者复制生成的查询并运行它,例如在SQL server management studio中。遗憾的是,编译器在OP的情况下几乎没有什么可做的,因为性能将主要取决于生成的SQL查询。
ctx
   .Students
   .Join(
      ctx.Countries.Where(q => q.CountryName == "USA"), 
      q => q.CountryId, 
      q => q.CountryId, 
      (c,s) => s)
   .Select(q => q.StudentName)
   .ToList();