2009-08-13 9 views
5

Ho 2 tabelle che hanno una relazione reciprocaCome faccio a fare ciò in Entity Framework (multiple where's o Join)?

La tabella A ha una relazione da 1 a molti con la tabella B, quindi crea una proprietà di navigazione in ciascuna.

Ora ho bisogno di controllare un valore dalla Tabella A (userName) e ho bisogno di controllare un valore dalla tabella B (ClubId).

Così nella mia mente sarebbe qualcosa di simile

Join the tables together 
Where A.userName == "bob" && 
where B.clubId == "Car" 

// return the count. 

ma ora so con Entity roba dovrebbe rendere meno comune si unisce quindi mi chiedo se posso farlo con un join allora.

Ho provato questo

int count = Entity.TableA.where(a => a.userName == "bob" && a.TableB.where(i => i.ClubId == "Car")).Count(); 

quindi questo non funziona in quanto non restituirà il giusto tipo (il 2 ° dove). Questo è il modo in cui ho pensato in linea con il modo in cui mi sarei aspettato che avrebbe funzionato.

Quindi, come dovrebbe essere?

P.S

Io invece ho un esempio nel metodo query LINQ come ho fatto in precedenza.

risposta

4

Filtering TableA prima aderire è probabilmente più efficiente:

var clubs = from a in Entity.TableA 
      where a.userName == "bob" 
      from b in a.TableB 
      where b.clubId == "Car" 
      select b; 

var count = clubs.Count(); 

Non è necessario usare due variabili, è solo la mia preferenza qui per chiarezza.

O in sintassi del metodo è possibile semplificare un po ':

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB) 
         .Count(b => b.clubId == "Car"); 

Tuttavia, io non sono certo EF comprende quelle espressioni particolari. In caso contrario, il compilatore tradurrà la query sopra in questo modo:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB, (a,b) => new { a, b }) 
         .Where(x => x.b.clubId == "Car") 
         .Count(); 
+0

Ah. Wow. Non sono sicuro di ciò che mi piace di più nel suo caso. Quella scelta mi butta via. Quindi cosa succede se ho bisogno di un altro filtro? dovrei aggiungere un altro selectMany? Bene, la prima sintassi del metodo funziona. Non so se scende internamente e fa la seconda cosa. Tutte le query richiederebbero lo stesso tempo di esecuzione. Cosa c'è nel secondo SelectMany one. come quello che è a => a.TableB, (a, b) =>) fare? – chobo2

+0

Ho aggiornato il post con una correzione nella traduzione della query. Il primo SelectMany essenzialmente "appiattisce" la raccolta nidificata, restituendo una sequenza di tutte le B da tutte le A's. Il secondo SelectMany accetta due delegati, un "collectionSelector" per recuperare la raccolta di B da un A e un "resultSelector" per specificare il valore restituito dato un A e B.LINQ seleziona solo entrambi gli oggetti di input, da utilizzare nel resto della query. – dahlbyk

5

Assumendo che il modello EF ha il rapporto tra utenti e club potrebbe fare qualcosa di simile:

var usersNamedBobInCarClub = 
      from A in User 
      from B in A.Clubs 
      where A.userName == "bob" && 
        B.clubId == "Car" 
      select A; 

Se si desidera che gli elementi di entrambi gli utenti e club tornare a dare un'occhiata al unisce all'interno della query.

+0

Ci proverò, ma come faccio a farlo nelle query del metodo Linq? – chobo2

Problemi correlati