2012-09-22 22 views
4

我的情況從數據庫中加載對象列表有效的方式來實例化一個對象

我有一個包含一些列出了C#對象。其中一個列表是例如一列標籤,它是c#「SystemTag」對象的列表。 我想以最有效的方式實例化這個對象

在我的數據庫結構,我有以下表格:

  • DBOBJECT - 其中包含有關我的C#對象的一些基本信息
  • dbTags表 - 所有可用的選項卡的列表
  • dbTagConnections - 一個列表有2個字段:TagID和ObjectID(以確保一個對象可以有幾個標籤)

(我有幾個其他類似的類型數據)

這是我現在該怎麼辦呢?

  1. 使用ID
  2. 發送DB對象的「對象工廠」模式,檢索從DB我的對象,然後意識到我們必須得到標籤(和其他列表)。然後使用我們的C#對象的ID
  3. 的DAL層檢索來自DB
  4. 這些數據發送到轉換成的標籤的「TagFactory」模式的數據發送調用DAL層
  5. 我們回到對象工廠

這真的是效率低下,我們對數據庫有很多調用。這尤其給出了問題,因爲我有4種以上的列表。

我試過了什麼?

我不是在SQL確實不錯,但我已經試過以下查詢:

SELECT * FROM dbObject p 
LEFT JOIN dbTagConnection c on p.Id= c.PointId 
LEFT JOIN dbTags t on c.TagId = t.dbTagId 
WHERE .... 

然而,因爲有tagconnections這個retreives儘可能多的對象 - 所以我不認爲加入作爲好辦法做到這一點。

其他信息...

  • 使用.NET Framework 4.0
  • 使用LINQ to SQL(BLL和DAL層在BLL工廠模式從DAL對象轉換)

...

那麼 - 我該如何解決這個儘可能高效? :-) 謝謝!

+0

我認爲你的'WHERE'子句有你想要檢索的對象的id? –

+0

是的,這是事實。但是,我還需要獲取我的對象列表 - 在這些情況下當然不是:-) –

+0

有很多考慮因素。在[SO線程]中有一些很好的數據訪問討論(http://stackoverflow.com/questions/2698151/entity-framework-vs-linq-to-sql-vs-ado-net-with-stored-procedures) 。 具體來說,如果你正在尋找速度(在你的要求效率),我會考慮實體框架。根據我的經驗,如果你能負擔得起的時間來適當地連接一切,LINQ到實體比LINQ到SQL要快得多。 – samuelesque

回答

1

乍一看,我不認爲你目前的工作方式是「低效率」(提供的信息)。我會替換代碼:通過兩次調用DALS方法

SELECT * FROM dbObject p 
LEFT JOIN dbTagConnection c on p.Id= c.PointId 
LEFT JOIN dbTags t on c.TagId = t.dbTagId 
WHERE ... 

,首先檢索對象主數據(1)和一個後得到的,只是,標籤的相關數據(2),您可以工廠填充了對象的標籤列表:

(1)

SELECT * FROM dbObject WHERE [email protected] 

(2)

SELECT t.* FROM dbTags t 
INNER JOIN dbTag Connection c ON c.TagId = t.dbTagId 
INNER JOIN dbObject p ON p.Id = c.PointId 
WHERE [email protected] 

如果你有許多對象和數據量只是少數(這意味着你不會管理大量的數據),那麼我會尋找一個基於ORM的解決方案,作爲Entity Framework

在DAO中編寫SQL查詢以控制所有查詢被髮送到數據庫服務器時,我仍然覺得很舒服,但最終這是因爲在我們的情況下是需要的。我不覺得有任何不便之處,無法查詢數據庫以恢復,首先,對象數據(SELECT * FROM dbObject WHERE [email protected])並填充對象實例,然後再次查詢數據庫以恢復您可能需要的所有衛星數據(您的標籤案件)。

您對自己的場景更加簡潔,以便我們能夠針對您的特定場景提供有價值的建議。無論如何,希望這對你有用。

1

在使用Java/MSSQL服務器/普通JDBC的以前項目中的類似情況下,我們使用返回多個結果集的存儲過程。

存儲過程採用與要檢索的對象相對應的ID,返回構建主對象的行,然後是與主對象建立每個一對多關係的多條記錄。這使我們能夠在單個數據庫交互中完整構建對象。

1

你有沒有想過使用實體框架?然後,您將以與您的應用程序中的任何其他類型的交互相同的方式與數據庫進行交互。

設置起來非常簡單,您可以在實體設計器中創建數據庫表之間的關係 - 這將爲您提供調用相關對象所需的所有外鍵。如果您將所有密鑰設置在數據庫中,則實體設計人員將使用這些密鑰 - 創建所有對象與選擇「從數據庫創建模型」一樣簡單,並且在更改數據庫時只需右鍵單擊設計師並選擇'從數據庫更新模型'

該框架爲您處理所有SQL - 因此您不必擔心這一點;在大多數情況下..

一個偉大的起點站起來,這種運行將是here,並here

一旦你擁有了一切設置,你可以使用LINQ輕鬆查詢數據庫。

你會發現這是一個很多比下降表適配器途徑更有效(假設這是你此刻在做什麼?)

很抱歉,如果我錯過了一些東西,你已經在使用這個.. :)

0

據我估計,你的數據庫已經存在,你熟悉的SQL。

您可能想要使用微型ORM,如petapoco。要使用它,您必須編寫與您在數據庫中具有的表匹配的類(有T4生成器可以使用Visual Studio 2010自動執行此操作),然後您可以編寫包裝來創建更豐富的業務對象(可以使用ValueInjecter來做到這一點,這是我使用過的更簡單),或者你可以照原樣使用它們。

Petapoco處理插入/更新操作,並自動檢索生成的ID。

因爲Petapoco handles multiple relationships太,它似乎符合您的要求。