Powiedzmy mamy:LINQ wyrażenie filtrować listę kolekcji jednostki i utrzymywać wykaz podmiotów
public class Foo
{
public long Id { get; set; }
public string Name { get; set; }
public ICollection<Bar> { get; set; }
}
public class Bar
{
public long Id { get; set; }
public int Age { get; set; }
public virtual Foo { get; set; }
public long FooId { get; set; }
}
Nasze dane mogą wyglądać następująco: (zakładając List<Foo>
)
// Forget the syntax, just to demonstrate data
foo[0] = new Foo{ Id = 1, Name = "A", Bar = { collection of Bars with Ages over 10 }};
foo[1] = new Foo{ Id = 2, Name = "B", Bar = { collection of Bars with Ages over 20 }};
foo[2] = new Foo{ Id = 3, Name = "C", Bar = { collection of Bars with Ages under 10 }};
Teraz powiedzmy, że chciałem wszystkie te Foo
s, ale z ich Bar
s tylko w tym Bar
w wieku od 5-25.
Dla czegoś takiego, pracowałbym w odwrotnej kolejności i otrzymywałbym wszystkie Bary, a następnie wszystkie powiązane Foos do tych pasków i ponownie odwzorowywałem Bary z powrotem na Foo. Wydaje się zbyt skomplikowane, niż powinno być.
Aby być bardziej jasne - Wszystko Foos z tylko ich drągi wieku od 5 do 25 :)
http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – Androiderson
Twoje pytanie jest trochę niejasna - chcesz wszystkich 'Foo's z tylko ich' Bar's z w wieku od 5 do 25 lat, czy chcesz tylko "Foo", które mają "Bar" z wiekiem od 5 do 25? –
Jednym ze sposobów, jeszcze niezalecanym, jest implementacja metody rozszerzenia na Foo z deklaracją podobną do: 'GetBarsBetween (int lower, int upper);' i po prostu użyj tej metody extenion, aby wykonać filtrowanie i pobieranie poprawnych pasów wewnątrz Foo. Następnie możesz po prostu wybrać wszystkie Foo 'gdzie foo.GetBarsBetween (5, 25) .Any()'. Nie wymaga to dodatkowej alokacji memów ani restrukturyzacji twoich obecnych obiektów. Dwie wady, nie można po prostu użyć istniejącego kodu do pracy z filtrowanymi paskami, a czas obliczeń jest nieco wyższy. – Polity