2013-11-01 17 views
5

Ho un layout di tabella come mostrato in questa immagine. Una tabella principale (Utente) e due tabelle molti-a-molti (Preferenza e Posizione) con tabelle di congiunzione. Ho installato le relazioni corrette nel modello dei dati per consentire selezioni da queste tabelle m-2-m ....Unione di tabelle many-to-many in Entity Framework

enter image description here

Lo strumento di rapporto che sto scrivendo permette all'utente di selezionare (da un lista di controllo) qualsiasi preferenza utente o posizione dell'utente. Quello che mi piacerebbe fare è scegliere solo i record dalla tabella Utente in cui le Preferenze O Posizioni contengono almeno una delle loro selezioni.

Ciò è possibile con una query Linq? (In precedenza ho fatto questo in SQL, ma sembrava più facile da scrivere in Linq finché non ho avuto a questa parte!)

Molte grazie,

EDIT: di Visual Studio 2012, Entity Framework 4, SQL Server 2008 R2

+0

Qualcosa di simile a 'Users.Where (x => Preferences.Any (y => y.UserID == x.UserID) || Locations.Any (y => y.UserID == x .UserID)); '? –

risposta

3
from u in Users 
where u.Locations.Any(l => l.Name == value) || 
     u.Preferences.Any(p => p.Title == value) 
select u; 

Questo genererà due sottoquery ESISTE. Lambda sintassi:

Users.Where(u => u.Locations.Any(l => l.Name == value) || 
       u.Preferences.Any(p => p.Title == value)); 
+1

Grazie! Questo mi sta friggendo il cervello da secoli. : -/ – Simon

+0

Proprio come dopo aver pensato, se ho un elenco dinamico di valori da confrontare - c'è un modo migliore per scrivere questo che usare l.Nome == "xxx" || l.Nome == "yyy" || l.Name == "zzz"? – Simon

+1

@Simon puoi creare un elenco di valori '{" xxx "," yyy "," zzz "}' e controllare se questo elenco contiene il percorso o il valore di preferenza: 'u.Locations.Any (l => values.Contains (l .name)) '. Credo che dovrebbe funzionare con la subquery. –