2015-04-24 9 views
5

Mam stronę internetową zawierającą artykuły informacyjne. Każda historia zawiera listę tagów z nią związanych. Inne strony w witrynie mają również listę tagów. Na jednej z pozostałych stron chcę wymienić wszystkie artykuły, które mają jeden lub więcej tagów wspólnych z listą tagów na bieżącej stronie. Napisałem kod Linq, który porównuje pojedynczy tag z tagami w każdym z artykułów, ale muszę go rozszerzyć, aby działał z listą tagów.Używanie Linq do porównywania listy z zestawem list w C#

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

Co chcę zrobić, to zastąpić currentTag listą znaczników. Lista może zawierać od 1 do 6 znaczników. Czy ktoś może pomóc?

Odpowiedz

7

Można użyć Intersect + Any:

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

ta zakłada, że ​​Tags faktycznie jest IEnumerable<string> lub inny typ, który nadpisuje Equals + GetHashCode. Jeśli tak nie jest, możesz podać niestandardowe IEqualityComparer<Tag> dla.

Więc tagList jest List<string> aktualnej strony zgodnie z życzeniem. Ale jeśli chcesz, aby wymienić wszystkie, które mają jeden lub więcej tagów wspólnych z listy tagów na wszystkich stronach, więc o IEnumerable<List<string>>, można użyć SelectMany spłaszczyć je:

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

Jeśli Intersect nie jest obsługiwany przez dostawcę LINQ można użyć następujące podejście:

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

to jest mniej wydajna w LINQ do obiektów, ponieważ nie jest to za pomocą zestawu.

+0

Dzięki, ale po uruchomieniu zapytania otrzymuję: 'Metoda 'Intersect' nie jest obsługiwana. Zgłaszanie typu: System.Linq.Enumerable' – fillostein

+0

Co to jest "x.Tags"? –

+0

'x' jest zbiorem stron z indeksu Lucene. 'x.Tags' to' IEnumerable ' – fillostein