2

我一直在使用 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 是否会遇到同样的问题?

4

1 回答 1

1

这是所谓的对象关系阻抗失配的一部分。除了在出现 SQL 时手动编码之外,没有通用的解决方案。

http://en.wikipedia.org/wiki/Object-relational_impedance_mismatch

是的,所有的 ORM 都会在某种程度上受到这种影响。我见过的最好的方法是创建表示应该返回哪些数据的声明性指令的对象。只有在最后一刻才将所有指令组合成一条 SQL 语句来执行。我认为这基本上是 LINQ 已经做的。

于 2013-08-29T07:15:27.957 回答