2015-04-24 15 views
5

Ho un sito Web contenente notizie. Ogni storia ha una lista di tag associati ad essa. Altre pagine del sito hanno anche una lista di tag. In una delle altre pagine desidero elencare tutte le notizie che hanno uno o più tag in comune con l'elenco di tag nella pagina corrente. Ho scritto un codice Linq che confronta un singolo tag con i tag su ciascuna delle notizie, ma ho bisogno di estenderlo in modo che funzioni con un elenco di tag.Uso di Linq per confrontare un elenco con un gruppo di elenchi in C#

query = query.Where(x => x.Tags.Contains(currentTag)); 

Quello che voglio fare è sostituire currentTag con un elenco di tag. L'elenco può contenere da 1 a 6 tag. Qualcuno può aiutare?

risposta

7

È possibile utilizzare Intersect + Any:

query = query.Where(x => x.Tags.Intersect(tagList).Any()); 

Questo presume che Tags in realtà è un o un altro tipo IEnumerable<string> che sostituisce Equals + GetHashCode. In caso contrario, è possibile fornire un numero personalizzato IEqualityComparer<Tag> per Intersect.

Quindi tagList è il List<string> della pagina di rientranza come richiesto. Ma se si vuole elencare tutti che hanno uno o più tag in comune con l'elenco dei tag su tutte le pagine, quindi un IEnumerable<List<string>>, si potrebbe usare SelectMany per appiattire loro:

query = query.Where(x => x.Tags.Intersect(allTagLists.SelectMany(list => list)).Any()); 

Se Intersect non è supportata dal provider LINQ è possibile utilizzare seguente approccio:

query = query.Where(x => x.Tags.Any(t => tagList.Contains(t))); 

Questo è meno efficiente in LINQ to Objects in quanto non sta usando un set.

+0

Grazie, ma quando si esegue la query ottengo: 'Il metodo 'Intersect' non è supportato. Tipo di dichiarazione: System.Linq.Enumerable' – fillostein

+0

Che cos'è 'x.Tags'? –

+0

'x' è un insieme di pagine di un indice di Lucene. 'x.Tags' è' IEnumerable' – fillostein

Problemi correlati