Два образца принципиально отличаются.
Первый образец
Я думаю, что вы вставили это неправильно... из упомянутого вопроса запрос должен быть:
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