2015-12-30 15 views
5

Mam listę foo zwaną naleśniki. Chcę wrócić foo gdzie bar.doritos == "coolRanch"Linq zapytanie o listę obiektów zawierających listę obiektów

class foo 
{ 
    List<bar> item; 
    string candy; 
    string beer; 
} 

class bar 
{ 
    string doritos; 
    string usb; 
} 

var item = crepes.item.Where(x => x.doritos == "coolRanch").FirstOrDefault(); 

Z innych wątków, mam poskładane powyższej kwerendy LINQ, ale crepes.item zgłasza błąd. „Lista nie zawiera definicji«elementu»a nie definicji dla«pozycji»przyjmując pierwszy argument ...

+1

Pola w 'C#' są * prywatne domyślnie *. Zmień swoją deklarację na 'publiczną listę item;' – Rob

+0

zarówno klasa, jak i prop są publiczne. Nadal dostaję błąd, czy mój linq jest poprawny? – Chris

Odpowiedz

11

Biorąc pod uwagę, że naleśniki to List<Foo>, należy dodać dodatkowy poziom do zapytania linq.

var item = crepes.Where(a => a.item.Any(x => x.doritos == "coolRanch")).FirstOrDefault(); 
3

Twój itemaccess modifier jest private (to jest C# Domyślna class), powinien on być wykonany public

Ten idzie do doritos też

ponadto, ponieważ twój crepes jest List umieścić dodatkową warstwę LINQ (jak również sugerowane przez innych), aby całkowicie naprawić, coś w tym

var item = crepes.Where(f => f.item.Any(b => b.doritos == "coolRanch")).FirstOrDefault(); //f is of foo type, b is of bar type 
+0

zarówno klasa, jak i prop są publiczne. Nadal dostaję błąd, czy mój linq jest poprawny? – Chris

+0

@Chris Jaki błąd generuje teraz? Myślę, że powinieneś również zmienić swoje "doritos" – Ian

2

Jeśli naprawić swoje klasy jak ten

class Foo 
{ 
    public List<Bar> Items { get; set; } 
    public string Candy { get; set; } 
    public string Beer { get; set; } 
} 

class Bar 
{ 
    public string Doritos { get; set; } 
    public string Usb { get; set; } 
} 

zapytanie będzie wyglądać

var crepes = new List<Foo>(); 
var item = crepes.FirstOrDefault(f => f.Items.Any(b => b.Doritos == "coolRanch")); 

Tutaj, staramy się zdobyć pierwszy Foo który ma co najmniej jeden Bar w Items gdzie Doritos == "coolRanch".