1
votes

Comment fonctionnent "Où" et "Sélectionner" dans LINQ?

J'ai l'extrait de code suivant. J'ai quelques questions concernant l'extrait de code que j'ai mentionné après.

var salaries = customerList
                    .Where(c => c.Age > 30)
                    .Select(c => c.Salary) // salary is of type long
                    .ToList();
  • Dans l'extrait de code ci-dessus, comment "Where" accède-t-il à la liste de clients et comment définit-il le type de "c"?
  • Est-ce que "Où" renvoie une liste temporaire de clients après avoir appliqué le filtre sur lequel agit la sélection?
  • Comment "Select" sait-il exactement qu'il ne doit renvoyer que le "Salary"?
  • Comment le type de la variable "salaires" est-il défini sur Liste ?


6 commentaires

Veuillez vérifier la signature .


Cela devrait aider; stackoverflow.com/a/671425/1608418


en savoir plus sur les expressions lambda lien


ici vous avez un article sur le fonctionnement de linq, et comment il est traduit lien


Je vous conseillerai de lire la série de Jon Skeet sur Réimplémentation de LinQ . L'article correspondant à cette question est: RÉIMPLÉMENTATION DE LINQ TO OBJECTS: PART 2 -" WHERE " et RÉIMPLÉMENTATION DE LINQ TO OBJECTS: PARTIE 3 -" SELECT "(AND A RENAME…)


Le livre de John Skeet: "C # in depth" m'a beaucoup aidé à comprendre LINQ et lambdas. Il y a beaucoup d'exemples et de bons conseils


5 Réponses :


1
votes

La clause Where existe dans la classe Enumerable qui utilise pour l'interrogation dans le framework .net. il fournit une condition booléenne et une source de retour. Il sera finalement converti en requête sql respective.

donc votre linq

SELECT [c].[Salary] FROM [CustomerList] WHERE [c].[Age] > '30'

commande sql old school

var salaries = customerList
                    .Where(c => c.Age > 30)
                    .Select(c => c.Salary) // salary is of type long
                    .ToList();


0 commentaires

2
votes

Cela vous aidera à mieux comprendre les expressions lambda. Anatomie de l'expression Lambda

Et ceci pour Linq

J'espère que cela vous aidera.

Merci.


0 commentaires

1
votes

comment "Où" accède-t-il à la liste des clients et comment définit-il le type de "c"?

  • customerList est de type List et Where () est une méthode d'extension de type List. La méthode Where () est donc accessible à customerList. c => c.Age> 30 est un prédicat défini dans la clause Where () . Cette liste d'aide de prédicat pour filtrer les données en fonction de la condition. Ici c indique un élément individuel présent dans la liste.

Comment "Select" sait-il exactement qu'il ne doit renvoyer que le "Salaire"?

  • Select est utilisé pour projeter un élément individuel à partir de la liste, dans votre cas, chaque client de customerList . Comme la classe Customer contient une propriété appelée Salary de type long, le prédicat Select créera une nouvelle forme d'objet qui contiendra uniquement la valeur de la propriété Salary de la classe Customer .

Comment le type de la variable "salaires" est-il défini sur Liste ?

  • Select () créera un nouveau formulaire avec uniquement la propriété Salary quelque chose comme
new {
      public long Salary{get; set;}
    }

.ToList () convertira IEnumerable renvoyé par Select en List . En fin de compte, vous obtiendrez List

"Où" renvoie une liste temporaire de clients après avoir appliqué le filtre sur lequel agit le Select?

  • Oui, Where renverra la liste filtrée (Precise IEnumerable ) sur laquelle vous avez appliqué la méthode Select ()

Je vous suggère de lire Linq en C # , Clause Where , Sélectionnez méthode , Liste .


0 commentaires

5
votes

est probablement implémenté comme ceci (notez qu'il s'agit d'une implémentation très approximative, donnez-vous simplement une idée de ce à quoi cela ressemble):

public static IEnumerable<U> Select<T, U>(this IEnumerable<T> source, Func<T, U> mapping) {
    foreach (T t in source) {
        yield mapping(t);
    }
}

Notez que Where est une méthode d'extension. Vous appelez essentiellement Where (customerList, c => c.Age> 30) . Vous devriez maintenant voir où il accède à la customerList . Il déduit également ce que devrait être T en regardant quel type de IEnumerable customerList est. Puisqu'il s'agit d'un IEnumerable , T est Customer , et il attend donc un Func code> pour le deuxième argument. C'est ainsi qu'il sait que c est Customer.

ne renvoie pas de liste temporaire. De nombreuses méthodes LINQ utilisent l'évaluation différée. renvoie un IEnumerable qui est filtré. N'oubliez pas que IEnumerable n'est qu'une séquence de choses. Cependant, cette séquence renvoyée par Where n'est pas évaluée tant que vous ne la demandez pas. Select fait de même. Ainsi, une liste n'est pas créée tant que vous n'appelez pas ToList .

Votre troisième question est un peu comme demander "Comment sait-il filtrer" ou "Comment Console.WriteLine sait-il écrire sur l'écran". C'est ce que fait Select . Vous pouvez regarder sa mise en œuvre si vous le souhaitez. Voici un aperçu:

public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) {
    foreach (T t in source) {
        if (predicate(t)) {
            yield return t;
        }
    }
}

Le type de la variable salaires est déterminé en regardant les signatures de méthode de chacune des méthodes que vous appelez. Votre appel Select renvoie un IEnumerable , et la signature de ToList indique au compilateur que, étant donné un IEnumerable il renverra List , donc dans ce cas, il renvoie une List.


0 commentaires

1
votes

Le lien de @Amit peut donner une bonne idée.

La réponse courte est que LINQ est construit sur la fonctionnalité du compilateur appelée Expressions. Lorsque vous écrivez quelque chose comme Where (c => c.Age> 18) , le compilateur ne compile pas réellement le c => c.Age> 18 comme un méthode régulière.

Il construit un arbre de syntaxe qui décrit ce que fait ce code.

La fonction Where utilise ceci pour créer une requête SQL qui est envoyée au serveur SQL qui l'exécute pour obtenir les résultats.

Nous vous suggérons d'examiner le fonctionnement de IQueryable et Expression pour plus d'informations.

Aide également à comprendre la différence entre IEnumerable et IQueryable .

Un autre exemple d'expressions utilisées dans d'autres parties de C # comme les pages Razor qui utilisent des fonctions telles que LabelFor (...) qui utilise la propriété que vous exprimez pour créer une étiquette HTML plutôt que exécution du code.

HTH


0 commentaires