a) Would the following two queries produce the same results:
var query1 = collection_1
.SelectMany(c_1 => c_1.collection_2)
.SelectMany(c_2 => c_2.collection_3)
.Select(c_3 => c_3);
var query2 = collection_1
.SelectMany(c_1 => c_1.collection_2
.SelectMany(c_2 => c_2.collection_3.Select(c_3 => c_3)));
b) I assume the two queries can’t always be used interchangeably? For example, if we wanted the output elements to also contain values of c_1 and c_2, then we only achieve this with query2, but not with query1:
var query2 = collection_1
.SelectMany(c_1 => c_1.collection_2
.SelectMany(c_2 => c_2.collection_3.Select(c_3 => new { c_1, c_2, c_3 } )));
?
Thank you
The snippets you’ve given seem to be invalid.
c_3isn’t defined in the scope of theSelectstatement, so unless I’ve misunderstood something, this won’t compile.It seems as though you’re trying to select the elements of
collection_3, but this is done implicitly bySelectMany, and so the finalSelectstatements in both cases are redundant. Take them out, and the two queries are equivalent.All you need is this:
Update:
x => xis the identity mapping, soSelect(x => x)is always redundant, regardless of the context. It just means “for every element in the sequence, select the element”.The second snippet is of course different, and the
SelectManyandSelectstatements indeed need to be nested in order to select all three elements,c_1,c_2, andc_3.Like Gert, says, though, you’re probably better off using query comprehension syntax. It’s much more succinct and makes it easier to mentally parse the workings of a query.