背景
我现在已经使用Entity Framework + Linq大约一年了,而且我还没有一个案例表明SQL语句会被要求 - 。当然,熟练的SQL编写者可能会做得更快,但我正在寻找ORM不可能或非常困难的事情。
问题
我的问题(为了满足我的好奇心)是ORM通常无法处理什么样的操作/情况?
我对数据库知之甚少,但如果你想删除一个表中的所有内容,那么至少在Entity Framework中你必须循环你想要删除的项目。
感谢您提供的信息
摘要 似乎性能和供应商特定的命令是ORM无法使用的原因(开箱即用)
答案 0 :(得分:2)
我还没有遇到一个ORM,可以做你可以用Oracle的分析查询做的事情。 (它成为SQL 2003标准的一部分,并且正在寻找进入其他数据库的方法。)有关分析查询的介绍,请参阅http://www.orafaq.com/node/55。
左边连接处还有一些细微之处,我通常在ORM中看不到,但我不知道Linq,它可能有它们。例如比较
SELECT ...
FROM foo
LEFT JOIN bar
ON bar.bar_id = foo.bar_id
AND bar.category_id = 5
LEFT JOIN baz
ON baz.baz_id = bar.bar_id
;
与
SELECT ...
FROM foo
LEFT JOIN bar
ON bar.bar_id = foo.bar_id
LEFT JOIN baz
ON baz.baz_id = bar.bar_id
AND bar.category_id = 5
;
Linq可以正确表达两个问题吗?
答案 1 :(得分:1)
如果有合适的开源ORM,ORM很可能会被修改,以便在任何情况下针对任何数据库供应商生成您想要的任何SQL。
因此,虽然没有开箱即用的ORM可能100%覆盖了您可以用SQL做什么(特别是数据库供应商特定/非标准SQL),但实际上没有技术原因可以解释为什么ORM不能被修改为这样做。
Entity Framework和Linq的功能版本不是很敏捷,因此适应ORM用户想要的东西可能会更慢。也就是说,Linq(不是LinqToSql)是ORM世界的一个很好的补充。
答案 2 :(得分:1)
根据我的经验,总是存在编写SQL本身更好的情况,而不是让ORM工具生成SQL。 我想避免这种情况,但在某些情况下,ORM无法为某些复杂查询生成最有效的SQL。
事实上,当我使用原生SQL而不是让我使用的ORM(NHibernate)完成工作时,主要是因为性能问题。
但是,NHibernate在生成性能最高的SQL方面做得非常好,所以不得不自己编写SQL,这真的很少见。