2011-09-08 10 views
10

ho una relazione molti-a-molti definita in questo modo:Entity Framework - Interrogazione una relazione molti-a-molti tabella di relazioni

Employees 
-------------- 
EmployeeID (PK) 

Roles 
-------------- 
RoleID (PK) 

EmployeeRoles 
-------------- 
EmployeeID (PK, FK) 
RoleID (PK, FK) 

Sto cercando di ottenere un elenco dei dipendenti, data una lista o RoleIDs:

private MyDBEntities _entities; 

public SqlEmployeesRepository(MyDBEntities entities) 
{    
    _entities = entities; 
} 

public IQueryable<Employee> GetEmployeesForRoles(int[] roleIds) 
{ 
    // get employees 
} 

Ma se provo e faccio _entities.EmployeeRoles, non v'è alcuna EmployeeRoles oggetto. Il mio edmx assomiglia a questo:

enter image description here

quindi è riconoscere la relazione tra le due tabelle, ma non è la creazione di un oggetto entità per EmployeeRoles.

Come è possibile ottenere un elenco distinto di dipendenti in base a un elenco di ID ruolo?

risposta

28

La relazione tra le tabelle Ruolo e Dipendente è rappresentata come proprietà di navigazione: ogni proprietà nell'entità Role conterrà solo i Dipendenti con questo ruolo particolare.

Mettendo tutto il contrario - la proprietà Roles di ogni dipendente contiene solo i ruoli di quel particolare dipendente.

Dato un insieme di ruoli roleIds a cercare è possibile utilizzare questo per ottenere l'elenco dei dipendenti che hanno un ruolo all'interno di questo insieme:

public IQueryable<Employee> GetEmployeesForRoles(int[] roleIds) 
{ 
    var employees = _entities.Employees 
          .Where(x=> x.Roles.Any(r => roleIds.Contains(r.RoleID))) 
    return employees; 
} 

Edit:

L'altro modo per convincere i dipendenti ad attaccare il problema dall'altro lato della relazione (a partire dal ruolo, non dal dipendente). Questo è molto probabilmente non efficiente come il primo approccio, dal momento che abbiamo dipendenti di de-duplicati (altrimenti dipendenti con ruoli vale a dire due avrebbero mostrato due volte):

public IQueryable<Employee> GetEmployeesForRoles(int[] roleIds) 
{ 
    var employees = _entities.Roles 
          .Where(r => roleIds.Contains(r.RoleID)) 
          .SelectMany(x=> x.Employees) 
          .Distinct() 
    return employees; 
} 
+0

Lol, stavo per postare questo come alternativa alla tua prima soluzione (con 'Distinct' ecc.), Ma ora non c'è più alternativa. Puoi lasciare la tua prima soluzione come un'altra opzione nella tua risposta. Era un modo interessante o c'era qualcosa di sbagliato in esso? – Slauma

+0

@Slauma: Sì, è un'alternativa - ma questo mi è sembrato più diretto dopo aver esaminato il problema, quindi ho graffiato il primo approccio - lascia che lo scavassi di nuovo ;-) – BrokenGlass

3

Forse?

var results = from r in db.Roles 
       where roleIds.Contains(r.Id) 
       select r.Employees; 
Problemi correlati