2014-01-29 114 views
1

我正在重構一個較舊的應用程序,它使用動態內聯SQL從大型Oracle數據庫中提取數據。我創建了一個工作正常的存儲過程(PL/SQL)。由於它只有一行(datarow),所以我讓它返回一個datarow。該課程駐留在DAL中。爲什麼使用匿名類型而不是創建類

因爲我重構的東西,我想我會從業務層(使用LINQ)隔離數據庫(在DAL中)。我的第一個想法是創建一個對象來包含返回的數據行。

我的一位同事推薦匿名類型,我不太熟悉。在我迄今爲止所做的閱讀中,它看起來很簡單。如果我仍然必須使用匿名類型來放置字段名和字段類型,我只是看不到其中的值。

我錯過了什麼嗎?如果我正在返回數據集/數據表,那麼使用匿名類型會有更多價值嗎?

+0

這是一個個案的基礎。如果您需要在功能之間傳遞數據,則不能使用它們。 – gunr2171

+0

謝謝你所有的答案。聽起來像匿名類型不是要走的路,我應該堅持使用一個類。 – gDeveloper

回答

5

匿名類型被設計用於創建它們的範圍。沒有其他範圍應該知道這個匿名類型的定義,所以既然你想從一個方法返回這個對象,匿名類型是不合適的。

一般來說,這個想法是,這個對象只用在一兩個地方,全都在同一個方法中,它的使用非常簡單直接,不需要創建一個新的指定類型。它們也是不可變的,並且在C#中創建不可變的對象是更詳細的。

+0

[使用C#7,我們現在可以返回可以重新分配給匿名類型的元組。](https://blogs.msdn.microsoft.com/dotnet/2017/03/09/new-features-in-c- 7-0 /) –

0

匿名類型非常適合一次性操作,但我不會將它們用作數據庫實體的替代品。這樣使用它真的是一個糟糕的設計。

0

既然你不能返回匿名類型,你當然不應該用then來表示域對象。它們的優點以一次性使用的形式出現,通常在處理一組數據對象時在lambda表達式中進行。

一個典型的例子是當您需要處理兩個單獨的集合時:您可以將zip them放在一起,並將結果投影到只存在於LINQ查詢範圍內的匿名類型。