I would personally separate it out:
Dim applesOnSale = AppleController.GetRedApples() _
.Where(Function(a) PriceController.OnSale(a))
For Each apple in applesOnSale
'do something
Next
In a full IDE the first part could be a single line - or you could use a VB query expression like this:
Dim applesOnSale = From apple in AppleController.GetRedApples() _
Where PriceController.OnSale(apple)
For Each apple in applesOnSale
'do something
Next
This separates the "what items you're interested in" from "what you want to do with the items" which I personally find useful in terms of readability.
Note that in some situations the Where
may not work, however - if GetRedApples
returns a table from a LINQ to SQL DataContext
, for example, it will try to translate the Where
clause into SQL - which won't work.
Assuming you're using LINQ to Objects though, the assignment won't actually do any looping - it will just set up the query. The "where" clause will only be evaluated for each item as you loop through the query.