是更好的Linq或SQL查询,用于复杂的计算和聚合吗?

时间:2018-10-17 16:46:23

标签: performance linq plsql report aggregation

我们必须在运行时(asp.net mvc)创建并显示一些包含数百万条记录的Oracle表数据中的复杂报告。报告数据必须从分组和很少的复杂计算中获得。 那么通过sql查询(pl / sql)或linq进行这些分组和计算的代码的性能和可维护性更好吗? 谢谢你的回信

1 个答案:

答案 0 :(得分:1)

  

这样做可以更好地提高代码的性能和可维护性   这些分组和计算是通过sql查询(pl / sql)还是通过linq?

这取决于您via linq的意思。如果您要获取完整的表到本地内存,然后使用linq语句提取所需的结果,那么SQL语句当然会更快。

但是,如果您要使用Entity Framework或类似的工具,那么答案就不那么容易了。

如果使用Entity Framework(或某些克隆),则表将由IQueryable<...>而不是IEnumerable<...>表示。 IQueryable有一个Expression和一个ProviderExpression代表必须执行的查询。 Provider知道哪个系统必须执行查询(通常是数据库管理系统)以及如何与该系统通信。当必须执行查询时,Provider的任务是将Expression转换成系统知道的语言(通常类似于SQL)并执行SQL查询。

有两种IQueryable LINQ语句:返回某物IQueryable<...>的那些和返回TResult的那些。返回IQueryable的人只会更改Expression。它们是使用延迟执行的函数。

不返回IQueryable的函数是ToList()FirstOrDefault()Any()Max()等。在内部,它们将调用将{ {1}}(通常通过foreach),命令GetEnumerator()转换Provider并执行查询。

返回您的问题

那么实体框架或SQL是哪一个效率更高?效率不仅是执行查询的时间,而且还是针对第一个版本和软件未来更改的开发/测试时间。

如果您使用实体框架(-clone),则根据框架制造商的不同,从Expression创建的SQL查询非常有效。如果您看一下代码,虽然有时必须成为一个很好的SQL程序员才能改善大多数查询,但有时SQL查询并不是最佳选择。

上面在SQL语句上使用Entity Framework和LINQ查询的最大优点是开发时间将缩短。 LINQ语句的语法在编译时检查,SQL语句在运行时检查。开发和测试周期将缩短。

重用LINQ语句很容易,而SQL语句几乎总是必须编写,尤其是对于要执行的查询。可以在没有数据库的情况下对代表表的任何项目序列进行LINQ语句的测试。

我的建议

对于大多数查询,您不会注意到实体框架查询或SQL查询在执行时间上有任何差异。

如果您期望复杂的查询和将来的更改,我将选择实体框架。在主要论点上,开发时间越短,测试可能性越好,可维护性越好。

如果在执行时间过长的情况下检测到某些查询,则始终可以通过执行SQL查询而不是使用LINQ来决定绕过实体框架。

如果您将Expressions包装在适当的存储库中,并且在用例的实现中隐藏了用例,则存储库的用户将不会注意到其中的区别。