2012-08-28 30 views
1

什麼是在儲藏庫級別水合對象的子實體的最佳方法。例如:我需要一個系統中所有人的列表。每個人都可以有很多電話號碼。我將如何去填充我的資源庫中的所有這些數據?更好的方法來爲所有子實體提供水合物。

public class Person 
{ 
    public int? Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string MiddleName { get; set; } 
    public List<Phone> PhoneNumbers { get; set; } 
} 

    public IEnumerable<Person> GetPeople() 
    { 
     var persons = new List<Person>(); 
     const string sql = "SELECT FirstName, LastName, MiddleName FROM Person.Person"; 

     while (reader.Read()) 
     { 
      var p = PersonFactory.GetPerson(reader); 
      p.PhoneNumbers = this.GetPhoneByPersonId(p.Id); 
      persons.Add(p); 
     } 

     return persons; 
    } 

    public IEnumerable<Phone> GetPhoneByPersonId(int? id) 
    { 
     while (reader.Read()) 
     { 
      numbers.Add(PersonFactory.GetPhone(reader)); 
     } 
    } 

我這個方法的問題是,我正在執行一堆命中DB的sql語句。這似乎不是最好的方法。我不能使用任何框架,並且必須使用DataReader。

我可以採取什麼更好的方法?這也是一個簡單的例子。我的Person對象將會有更多的列表。

+0

+1只是因爲我感到抱歉,你必須重新發明輪子並重新實施一些已經解決的問題。 http://lostechies.com/jimmybogard/2012/07/24/dont-write-your-own-orm/ – Dmitry

回答

1

實現GetPeople方法的一種方法是執行包含多個結果集的單個SQL語句。如果在啓用MAR S的情況下使用SQL Server,則這將來自服務器,作爲對單個查詢的響應。否則,您可以執行兩個查詢,一個用於檢索人員,另一個用於檢索與這些人員關聯的所有電話號碼。

你的查詢可以是這個樣子:

SELECT FirstName, LastName, MiddleName FROM Person.Person WHERE -- omitted 

SELECT PhoneNumber,Name FROM Person.PhoneNumbers WHERE -- restrict to same set as above 

同樣,你可以在一個命令同時發送查詢,如果服務器支持的話,或發出兩個單獨的查詢。無論哪種方式,這只是兩個查詢,這是沒有什麼大不了的。確保你一次不會返回太多結果。

一旦你在內存中有兩個結果集,你可以通過人員ID加入他們,並將所有人員實例與他們相應的電話號碼相關聯。總體而言,您正在執行一個或兩個數據庫查詢。

IDataReader提供方法NextResult來枚舉查詢返回的多個結果集。

+0

假設我需要帶回100個人才能在列表中顯示。您在第二個查詢中說,我應該使用Where In來獲取第一個返回的人員? –

+0

是的,你可以做一個在哪裏或內部加入。 ORM通常會在哪裏進行。 – eulerfx

相關問題