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();
5 Réponses :
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();
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.
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éthodeWhere ()est donc accessible à customerList.c => c.Age> 30est un prédicat défini dans la clauseWhere (). Cette liste d'aide de prédicat pour filtrer les données en fonction de la condition. Icicindique 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
clientdecustomerList. 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éSalaryde la classeCustomer.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 commenew { public long Salary{get; set;} }.ToList () convertira
IEnumerablerenvoyé par Select enList. En fin de compte, vous obtiendrezList"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éthodeSelect ()Je vous suggère de lire Linq en C # , Clause Where , Sélectionnez méthode , Liste .
Où 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 c est Customer.
Où ne renvoie pas de liste temporaire. De nombreuses méthodes LINQ utilisent l'évaluation différée. Où 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 Où 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.
Le lien de @Amit peut donner une bonne idée. p>
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
Veuillez vérifier la signature
Où.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