2013-07-09 120 views
1

我有以下爲我的實體框架類的一部分的值: -使用自定義對象

public CustomerDetails GetCustomer(int id) { 

     var customerDetails = entities.AccountDefinitions 
     .Where(a => a.ORG_ID == id) 
     .Select(cd => new CustomerDetails 
     { 
      AD = cd, 
      SD = cd.SDOrganization, 
      AA = cd.SDOrganization.AaaPostalAddresses, 
      SN = cd.SiteDefinitions, 
      Ar = cd.SiteDefinitions.SelectMany(a => a.DepartmentDefinitions.SelectMany(a2 => a2.SDUsers.Select(a3 => a3.AaaUser))) 
     }) 
     .SingleOrDefault(); 
     return customerDetails; 
     } 

內。選擇裏面我有五個任務操作,但是因爲一些分配取決於其他所以如何我寫的東西,如: -

Ar = SN.SelectMany(…….) 

所以在這種方式我將只查詢數據庫只有一次檢索cd.SiteDefenitions?

+0

我認爲你可以像'SN = cd.SiteDefinitions.Include(「DepartmentDefinitions.SDUsers)一樣使用[Include method](http://msdn.microsoft.com/en-us/library/bb738708.aspx)。 AaaUser「),以便對第一個引用的查詢也將檢索第二個引用所需的數據,以便不需要對數據庫進行第二次查詢。不過,我會證實這一點。 –

+0

實體框架創建了很多未解答的問題,並且您對如何執行查詢感到困惑。我用數據庫上的存儲過程來完成所有的工作,事情很清楚。並且您感覺更安全,因爲您確信哪些數據將被準確傳輸到客戶端 –

回答

1

一個辦法是做這樣的:

var customerDetails = entities.AccountDefinitions 
    .Where(a => a.ORG_ID == id) 
    .Select(cd => new CustomerDetails 
    { 
     AD = cd, 
     SD = cd.SDOrganization, 
     AA = cd.SDOrganization.AaaPostalAddresses, 
     SN = cd.SiteDefinitions 
    }) 
    .SingleOrDefault(); 

if (customerDetails != null) 
{ 
    customerDetails.Ar = customerDetails.SN... 
} 

return customerDetails; 

我知道這可能不是很什麼你要找的,但你不會在在SN屬性將能夠get像這樣的無參數構造器操作(AFAIK)。

+0

因此,對數據庫執行多個查詢以啓動類,而不是重新使用內存中已存在的數據是一種不好的做法。 –

+0

@JohnPeter,做一次往返會更好,儘管這是可以辯論的。在你的場景中,我會說,爲了確保代碼**在數據庫擴展時縮放**,在對象初始化後不要進行兩次往返並設置「Ar」。 –

+0

所以唯一的選擇是遵循你的方法? –