Les deux échantillons sont fondamentalement différents.
Premier échantillon
Je pense que vous avez collé à tort celui-ci ... de la question référencée, la requête doit être:
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();
(je vais supposer que LocationID
et ParentLocation
sont typée comme int
)
Dans cet exemple parentLoc
est un int
-. une seule instance d'unValeur, obtenue à partir du tableau PartsLocations
. Donc ce que vous obtenez est un int
.
La deuxième instruction linq extrait également ses enregistrements de la table PartsLocations
. Il utilise parentLoc
pour identifier les enregistrements dans cette table (par exemple where b.LocationID == parentLoc
). Ce que vous obtenez à la fin est un ensemble de PartsLocations
enregistrements.
L'appel .Single()
est faite parce que vous voulez comparer le résultat à LocationID
dans la deuxième déclaration, et ne peut pas comparer int
à IEnumerable<int>
.
Deuxième échantillon
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
Dans le second échantillon, persVogel
est un sous-ensemble d'enregistrements de la table People
(plus précisément, le sous-ensemble de personnes avec LastName == "Vogel"
) - donc ce que vous obtenez est un ensemble de People
enregistrements.
La deuxième instruction linq est basée sur ce sous-ensemble d'enregistrements (From pp In persVogel
) et les filtre ensuite vers les enregistrements où pp.Company.Name = "PHVIS"
. Ce que vous obtenez est toujours un ensemble de People
enregistrements.
Ces deux déclarations pourraient facilement être compressés dans une seule instruction:
Dim persVogelPHVIS = From p In db.People
Where p.LastName = "Vogel"
AndAlso p.Company.Name = "PHVIS"
Select p
Vous obtiendrez toujours un ensemble de People
dossiers à la fin.
'Simple()'? Où? L'usage des deux résultats ne le rend-il pas évident? –
votre premier exemple est C#, la seconde est VB, ce qui est source de confusion – Turo
Merci Brett. Pourrait-on alors déduire que la base de données est interrogée deux fois dans le premier exemple - One pour obtenir Single() et ensuite lors du traitement de la deuxième requête? –