【问题标题】:LINQ order of Where clause and JoinWhere 子句和 Join 的 LINQ 顺序
【发布时间】:2018-05-03 18:28:43
【问题描述】:

两者之间是否存在性能差异:

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.Where(q => q.CountryName == "USA"), 
      q => q.CountryId, 
      q => q.CountryId, 
      (c,s) => s)
   .Select(q => q.StudentName)
   .ToList();

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

【问题讨论】:

  • 这是在内存中执行的 Linq 还是生成 sql 查询的 Linq?您是否运行了这两个案例?
  • @Fabio, LINQ 生成 SQL 查询。但是如果它在内存中执行,答案会有什么不同呢?是的,我确实运行了这两个案例。
  • 如果您同时运行这两种情况 - 检查生成的 SQL 查询或使用 SQL 探查器获取性能详细信息或复制生成的查询并运行它,例如,在 SQL Server Management Studio 中运行。

标签: c# .net linq join where


【解决方案1】:

一般规则是过滤器左,这意味着先做你的过滤器。但是,对于像 C# 这样的编译语言,您确实应该对其进行测试。抛出一些时间戳,看看执行大型查询需要多长时间。

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

【讨论】:

  • 遗憾的是编译器在 OP 的情况下几乎没有什么可做的,因为性能主要取决于将生成什么 sql 查询。
猜你喜欢
  • 1970-01-01
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 2011-04-27
相关资源
最近更新 更多