我们必须在运行时(asp.net mvc)创建并显示一些包含数百万条记录的Oracle表数据中的复杂报告。报告数据必须从分组和很少的复杂计算中获得。 那么通过sql查询(pl / sql)或linq进行这些分组和计算的代码的性能和可维护性更好吗? 谢谢你的回信
答案 0 :(得分:1)
这样做可以更好地提高代码的性能和可维护性 这些分组和计算是通过sql查询(pl / sql)还是通过linq?
这取决于您via linq
的意思。如果您要获取完整的表到本地内存,然后使用linq语句提取所需的结果,那么SQL语句当然会更快。
但是,如果您要使用Entity Framework或类似的工具,那么答案就不那么容易了。
如果使用Entity Framework(或某些克隆),则表将由IQueryable<...>
而不是IEnumerable<...>
表示。 IQueryable
有一个Expression
和一个Provider
。 Expression
代表必须执行的查询。 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
包装在适当的存储库中,并且在用例的实现中隐藏了用例,则存储库的用户将不会注意到其中的区别。