我一直在使用 linq-to-sql 和 ado.net entityframework。每次我们遇到性能问题,几乎都是因为使用了 EF/linq to sql。编写代码似乎很容易,要么触发大量查询,要么首先获取 1000 条记录来做一些内部工作,然后再给出实际结果。即使以我在这个问题上的知识和经验,我也经常发现自己使用某种逻辑 C# 语句来触发对数据库执行非常不合逻辑的查询。
一个简单的例子:假设您有 2 个表 Customer 和 Invoices。发票具有 Customer 表的 CustomerID
这将首先从数据库中获取所有发票记录,然后检查是否有任何记录。如果您的客户有 1000 张发票,则 1000 条记录将从数据库发送到您的应用程序
Customer.Invoices.Any() //or .Where or some paging statement or ...
这里的解决方案是直接在datacontext上查询
db.Invoices.Any(invoice=>invoice.CustomerID=Customer.CustomerID)
我确信总是有技术解释和解决问题的解决方案,但映射器很容易搞砸应用程序的性能似乎很不合逻辑。这些映射器非常简单,因此任何初级程序员都可以使用它,并承担所有后果。我见过一些或多或少有经验的开发人员甚至没有意识到这个问题。为什么我在谷歌上找不到任何关于这个“陷阱”的参考?我没有看到正确的道路吗?像 NHibernate 这样的其他 ORM 是否会遇到同样的问题?