为什么用EF/Linq到sql创建性能不好的查询如此容易
本文关键字:查询 性能 EF Linq 创建 sql 为什么 | 更新日期: 2023-09-27 18:29:31
我已经使用linq到sql&ado.net实体框架。每次我们遇到性能问题时,几乎总是由于对sql使用了EF/linq。编写代码似乎很容易,既可以引发大量查询,也可以在给出实际结果之前先获取1000条记录来做一些内部工作。即使以我的知识&根据这个问题的经验,我经常发现自己使用某种逻辑C#语句,它会向数据库发出一个非常不合逻辑的执行查询。
一个简单的例子:假设您有两个表Customer和Invoices。发票在客户表中有一个客户ID
这将首先从数据库中获取所有发票记录,然后检查是否有任何记录。如果您的客户有1000张发票,1000条记录将从数据库发送到您的应用程序
Customer.Invoices.Any() //or .Where or some paging statement or ...
这里的解决方案是直接在数据上下文上查询
db.Invoices.Any(invoice=>invoice.CustomerID=Customer.CustomerID)
我相信总会有技术解释和解决方案来解决这个问题,但这似乎太不合逻辑了,以至于映射程序很容易破坏应用程序的性能。这些映射器非常简单,所以任何刚开始的程序员都可以使用它,并承担所有后果。我见过一些或多或少有经验的开发人员甚至没有意识到这个问题。为什么我在谷歌上找不到任何关于这个"陷阱"的参考?我没有看到正确的道路吗?像NHibernate这样的其他ORM也有同样的问题吗?
这是所谓的对象关系阻抗失配的一部分。这个问题没有通用的解决方案,只能在SQL出现时手动编码。
http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch
是的,所有ORM都在某种程度上受到这种影响。我见过的最好的方法是创建表示应该返回哪些数据的声明性指令的对象。只有在最后一刻,您才能将所有指令组合到一个SQL语句中执行。我认为这基本上就是LINQ已经做的。