2011-02-17 18 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,這種情況非常罕見。