2011-02-17 56 views
0

背景ORM的操作无法处理,需要使用SQL吗?

我一直在使用实体框架+ LINQ的大约一年,我还没有一个单一的情况下,其中的SQL语句会一直-required-。当然,可能有些技术熟练的SQL编写者可以做得更快,但我正在寻找ORM的不可能或非常困难的事情。

问题

我的问题(以满足我的好奇心)是什么样的操作/情况ORM的一般不能处理?

我对数据库知之甚少,但不是这样,如果你想从一个表中删除所有的内容,那么至少在实体框架中,你将不得不循环你想要删除的项目。

谢谢您的信息

摘要 看来,性能和供应商特定的命令是为什么ORM不能使用(外的开箱)

回答

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能正确表达这两个查询?

+0

非常好。这是一个很好的答案。我不得不承认,我对SQL的一点知识现在几乎完全丧失了。也许某个知道SQL和Linq的人可以回答你。 – Tx3 2011-02-17 08:59:40

+0

仅仅因为Linq不能做某事,并不意味着ORM不能做到这一点。将Linq翻译成SQL是很困难和不完善的。非Microsoft ORM提供了更易于转换为SQL的其他查询接口(除了提供Linq查询接口外)。 – 2011-02-17 11:13:16

1

给定一个合适的开源ORM,ORM可能会被修改,以便在任何情况下针对任何数据库供应商生成所需的任何SQL。因此,虽然没有开箱即用的ORM可能对SQL可以做的100%覆盖(尤其是数据库供应商特定/非标准SQL),但是ORM可能“不要修改这样做。

实体框架和Linq的功能版本不是非常灵活,因此这些功能可能会较慢地适应ORM用户的需求。也就是说,Linq(不是LinqToSql)是ORM世界的一个很好的补充。

1

根据我的经验,总是有些情况下最好是编写SQL本身,而不是让ORM工具生成SQL。 虽然我想避免这种情况,但在某些情况下,ORM无法为某些复杂查询生成最高效的SQL。

实际上,当我使用本机SQL而不是让ORM使用(NHibernate)来完成这项工作时,主要是因为性能问题。
但是,NHibernate在生成性能最高的SQL方面做得非常好,所以不得不自己编写SQL,这种情况非常罕见。