Два образца принципиально отличаются.
Первый образец
Я думаю, что вы вставили это неправильно... из упомянутого вопроса запрос должен быть:
var parentLoc = (from a in db.PartsLocations
where a.LocationName == aContainer
select a.ParentLocation).Single();
var locations = (from b in db.PartsLocations
where b.LocationID == parentLoc
select b).ToList();
(Я собираюсь предположить, что LocationID и ParentLocation набираются как int.)
В этом примере parentLoc представляет собой int — единственный экземпляр значения ParentLocation, полученный из таблицы PartsLocations. Итак, вы получаете int.
Второй оператор linq также получает свои записи из таблицы PartsLocations. Он использует parentLoc для идентификации записей в этой таблице (например, where b.LocationID == parentLoc). В итоге вы получите набор из PartsLocations записей.
Вызов .Single() сделан, потому что вы хотите сравнить результат с LocationID во втором операторе и не можете сравнить int с IEnumerable<int>.
Второй образец
Dim persVogel = From p In db.People
Where p.LastName = "Vogel"
Select p
Dim persVogelPHVIS = From pp In persVogel
Where pp.Company.Name = "PHVIS"
Select pp
Во втором примере persVogel — это подмножество записей из таблицы People (в частности, подмножество людей с LastName == "Vogel"), поэтому вы получаете набор из People записей.
Второй оператор linq основан на этом подмножестве записей (From pp In persVogel) и дополнительно фильтрует их до записей, где pp.Company.Name = "PHVIS". То, что вы получаете, по-прежнему представляет собой набор из People записей.
Эти два утверждения можно легко сжать в одно:
Dim persVogelPHVIS = From p In db.People
Where p.LastName = "Vogel"
AndAlso p.Company.Name = "PHVIS"
Select p
В конце вы все равно получите набор из People записей.
18.10.2017