2011-11-23 60 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的工作原理。如果您想过滤关系并通过单个查询检索所有数据,则必须始终使用投影。