2017-10-18 13 views
0

Quelle est la différence entre la requête dans ce post: Save LINQ Query As Variable To Call Another LINQ Queryrequête LINQ variable est passé à une autre requête LINQ

var parentLoc = (from a in db.PartsLocations 
       where a.LocationName == aContainer 
       select a.ParentLocation); 

var locations = (from b in db.PartsLocations 
       where b.LocationID == parentLoc 
       select b).ToList(); 

à l'exemple suivant de this poste.

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 

Ces deux requêtes ont déclaré 2 requêtes et utilisent la première variable de requête dans la deuxième requête. Quelle est la raison d'utiliser Single() dans le premier exemple mais n'a pas été utilisé dans l'article visualstudiomagazine.com? Merci

+0

'Simple()'? Où? L'usage des deux résultats ne le rend-il pas évident? –

+1

votre premier exemple est C#, la seconde est VB, ce qui est source de confusion – Turo

+0

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? –

Répondre

0

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.