2016-07-28 8 views
0

Ich habe ein Modell in meiner Web-Anwendung wie folgt aus:Looping durch Model Collection und filtern, um eine Abfrage in asp.net MVC

class MyClass 
{ 
    int ID; 
    List<AnotherClass> foo {get; set;} 
} 

class AnotherClass 
{ 
    int ID; 
    string bar; 
} 

Ich habe auch eine Liste der Filter-Strings vom Benutzer gegeben.

List<string> filter = new List<string> { "foo", "bar" } //as example 

Was ich will, ist MyClass durch die gegebenen Strings wie diese zu filtern:

var result = context.MyClass.Include(mc => mc.foo); 
result = result.Where(x => filter.Any(f => f == x.foo.Select(d => d.bar))); 

Das Problem ist: Select() eine Liste von Strings zurück, und ich kann nicht einen String mit einer Liste der Vergleichs Saiten.

Jeder eine Idee, wie Sie dieses Problem beheben können?

+0

Verwenden Sie FirstOrDefault oder SingleORDefault es wird Ihnen nur ein Ergebnis. –

Antwort

0

Wenn in Worte zu fassen, was Sie wollen, ist: Finden Unabhängig davon, welche Artikel in Folge, wenn einer ihrer inneren Klasse Elemente in der Filterliste ist

Versuchen:

result.Where(item => item.Any(innerItem => filter.Contains(innerItem.bar))) 

oder in der anderen Syntax:

var output = (from item in result 
       from innerItem in item.foo 
       where filter.Contains(innerItem.bar) 
       select item); 
0

Verwenden Contains

result = result.Where(x => x.foo.Any(i => filter.Contains(i.bar))); 
0

Sie benötigen wahrscheinlich einfache Methoden Any und Contains, und Sie könnten dies tun.

result.Where(x => x.foo.Any(f=> filter.Contains(f.bar));