2011-11-23 22 views
1

我有以下層次LINQ到實體:嵌套列表的條件裝載

class Account 
    string username 
    List Delegations 

class Delegation 
    List SingleDelegations 

class SingleDelegation 
    string uid 

現在,我想執行它加載一個Account對象與根據依賴關係的查詢中的對象(即代表團和Delegations.SingleDelegations)已加載(與單查詢),它應該只是加載這些符合規定的條件,即

  • 只有那些用戶名的參數匹配帳戶(容易)
  • 只有那些SingleDelegation的物件,UID給定參數

我的做法一致
我在AccountRepository

public Account ReadAccountsByUsernameAndUid(string username, string uid) 
{ 
    var matchingObjs = (from a in context.Accounts 
          from d in a.Delegations 
          from sd in d.SingleDelegations 
          where 
           a.username == username && 
           sd.uid == uid 
          select new 
          { 
           Account = a, 
           Delegation = d, 
           SingleDelegation = sd 
          }); 

    //knowing there should be just one account (ignore the missing null check for now) 
    return matchingObjs.FirstOrDefault<Account>().Account;   
} 

以下方法這顯然返回具有匿名類型的對象不同的對象暴露爲屬性。由於AccountDelegationSingleDelegation通過相應的FK鏈接,因此我的Account對象將正確加載它們(如上下文所知)。

個人而言,這看起來很奇怪。我必須創建一個新的匿名類型來指示EF將子對象包含在查詢s.t中。最後,我正確加載了我的Account對象。

我的問題:
有更好,更好的方法嗎?

回答

2

不,沒有更好或更好的方法。這就是EF的工作原理。如果您想過濾關係並通過單個查詢檢索所有數據,則必須始終使用投影。