2012-06-21 18 views
5

Ho due tabelle Service e Provider. Tra di loro c'è un tavolo di congiunzione ServiceProvider che ha solo 2 campi - uno per ciascuno dei due PK. Quando viene aggiunto a edmx, la tabella molti a molti viene aggiunta e non può essere vista (come previsto).Molti a molti selezionare in LINQ alle entità

Questo va tutto bene tranne quando voglio ottenere Provider basati su un determinato servizio. Da questo question:

sembra che la risposta sarebbe semplice:

var query = from p in entities.Providers 
      from s in entities.Services 
      where s.Id == 15 
      select p; 

ma restituisce tutti i fornitori. Cosa sto facendo di sbagliato qui?

+0

non 'non S' avere una proprietà' Providers' è possibile utilizzare? – Rawling

+0

Sì s.Providers è una raccolta di provider, ma non è stato possibile ottenere che funzioni come parte della selezione. – finoutlook

+0

@abatishchev: grazie per le modifiche, ma non cambierà il titolo, renderebbe la domanda più difficile da trovare se qualcuno cerca framework di entità molti-a-molti? (Mi rendo conto che il suo EF è definito dal tag, ma verrà effettuata una ricerca su di esso) – finoutlook

risposta

4
var query = entities.Providers.FirstOrDefault(p => p.Id == 15).Services.ToList(); 
+0

Penso che tu abbia i tuoi 'Provider e' Servizi' nel modo sbagliato. – Rawling

+0

Sì, erano i provider che stavo cercando di produrre, ma la vedo simmetrica in ogni caso – finoutlook

+0

Sì, immagino che il principio funzioni in entrambi i modi. – Rawling

-1

Si può provare a utilizzare join, in questo modo:

entity.Providers.Join(entity.Services, c => c.ID, p => p.ID,(c, p) => new { Providers= c, Services= p }) 
+0

Perché l'ID del provider dovrebbe corrispondere all'ID del servizio? Perché stai selezionando una coppia {Provider, Servizi} quando pinna vuole solo un elenco di fornitori? – Rawling

+0

proponendogli solo un modo che lui potesse capire. Può impostare in un secondo momento e rimuovere ciò di cui non ha bisogno – Boomer

+0

Quindi è possibile rimuovere l'istruzione 'Join'? La struttura delle entità – Rawling

2

Prova questa:

var res = from s in entities.Services 
      where s.Id == 15 
      select s.Provider; 

EDIT

corretto e testato la query sul modello di vita reale e dati. Ora funziona.

+0

Non funzionerà in una relazione molti a molti, poiché i tipi di raccolta di solito non hanno una proprietà 'Id'. – Nuffin

+0

Corretta la risposta. –

2

Non è il più semplice

var matchingProviders = entities.Services.Single(s=>s.Id==15).Providers; 
+0

Questo funziona. Sono ancora confuso perché l'altra domanda che ho menzionato ha avuto upvotes - e questo post ha lo stesso suggerimento 'double from': http://smehrozalam.wordpress.com/2010/06/29/entity-framework-queries-involving- tabelle molti-a-molti-relazioni/ – finoutlook

+0

@Downvoter: cura di commentare? – Rawling

+0

@finoutlook Non ho molta familiarità con il framework di entità, ma se funziona - e non sembra troppo azzardato per farlo funzionare - allora funziona :) – Rawling