2013-03-09 44 views
0

我有兩個DTO的:添加的DTO的列表主DTO

public class MasterDTO 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<DetailDTO> Details { get; set; } 
} 

public class DetailDTO 
{ 
    public int Id { get; set; } 
    public string DetailName { get; set; } 
} 

另外,我有一個函數:

using (var context = new Context()) 
{ 
    var r = context.MasterData 
        .Select(d => new MasterDTO 
        { 
         Id = d.Id, 
         Name = d.Name, 
        } 
} 

我需要填寫DetailDTOs名單也和做在一個請求中。

此時,我必須獲取DetailsData數據列表,並將其通過foreach添加到MasterDTO中,這當然會導致對數據庫服務器的很多請求。

有沒有更好的解決方案?

+0

你有你的外鍵關係在DB設置?如果你這樣做,上下文可以爲你自動填充細節數據。 – 2013-03-09 15:11:54

+0

@BobHorn想念你在這裏! – Khan 2013-03-09 15:23:24

+1

@JefferyKhan哈哈。我知道!我去了你的個人資料頁面,但很難說這是否真的是你。你名字的拼寫把它給了。 :) – 2013-03-09 15:24:45

回答

3

在您的數據調用中,對您的DetailData進行熱切的加載。 例子:

var r = context.MasterData.Include("DetailData")

DetailData應該連接到您的MasterData實體的導航屬性的名稱。

這將導致詳細數據與您的電話MasterData一起被拖動。

完整的呼叫可能是這個樣子:

using (var context = new Context()) 
{ 
    context.LazyLoadingEnabled = false; 
    var r = context.MasterData.Include("DetailData") 
     .Select(d => new MasterDTO() 
     { 
      Id = d.Id, 
      Name = d.Name, 
      Details = d.Details.Select(dt => new DetailDTO() 
      { 
       Id = dt.Id, 
       DetailName = dt.DetailName 
      }) 
     }); 
} 
+0

它會加載整個對象,而不是我需要「挑選」** ** **和**名稱** – Dimitri 2013-03-09 15:19:07

+0

我已經包括如何禁用延遲加載,因此它只會拉你告訴它。 – Khan 2013-03-09 15:22:21

+2

+1,因爲這回答了這個問題。你必須小心,雖然。如果這是在你的數據層中,那麼這不是你想要擔心DTO中的內容傳遞給視圖的地方。這將數據層耦合到視圖。如果這是一個不平凡的應用程序,那麼最好包括完整的對象,然後在服務層進行DTO映射。 – 2013-03-09 15:23:37