La conversion expression lambda dans une arborescence d'expression
À partir de C# en profondeur:
Pas tous les lambda expressions peuvent être convertis à des arbres d'expression. Vous
ne pouvez pas convertir un lambda avec un bloc d'instructions ( même juste un
instruction return ) dans une expresion de l'arbre --> il doit être sous la forme
qui n'évalue une expression unique.
Depuis Linq-to-Objet de déclarations n'est pas converti dans l'expression des objets de l'arborescence, les lambda expressions utilisées avec Linq-to-Objet les opérateurs peuvent contenir un bloc d'instructions
string[] count = { "one ", "two ", "three ", "four ", "five ", "six " };
IEnumerable<int> result = count.Select(item =>
{
Console.WriteLine(item);
return item.Length;
});
foreach (int i in result);
De SORTIE:
one two three four five six
Je n'ai pas encore commencé l'apprentissage De Linq-to-Sql et Linq-to-Entités, mais je suppose que les expressions lambda utilisé avec LINQ états qui fonctionnent sur IQueryable<T>
ne peut contenir qu'une seule expression, en raison de restristion qu'une seule expression peut être convertie en une arborescence d'expression?
Merci
OriginalL'auteur AspOnMyNet | 2011-12-07
Vous devez vous connecter pour publier un commentaire.
Il n'est pas seulement qu'elles ne peuvent contenir qu'une seule expression - c'est ne peut pas être un déclaration lambda à tous. Même un bloc comme ceci:
serait pas valide pour LINQ to SQL. Il devrait être exprimée comme:
(J'ai juste remarqué que c'est peu de le livre que vous avez cité. Oh, bien qu'il montre, je suis cohérent 🙂
Noter que .NET 4, l'expression des arbres eux-mêmes ne ont la capacité de contenir des blocs, mais le compilateur C# ne peut pas traduire l'énoncé lambdas dans ce genre d'expression de l'arbre. Il existe d'autres restrictions trop, mais ils causent rarement des problèmes.
Cela est spécifié dans la section 4.6 de la C# 4 spec:
merci à vous deux très beaucoup
Soudain, elle s'est produite à moi de façon très liée à cette question est de que sur stackoverflow.com/questions/8405423/... clin d'oeil clin d'oeil
Jon, que voulez-vous dire lorsque vous dites qu'il ne peut pas être une déclaration lambda? La question présente un exemple de code utilisant une instruction lambda et il affiche les valeurs correctes.
Il utilise une déclaration lambda... Mais il se transforme en un délégué, pas une expression de l'arbre.
OriginalL'auteur Jon Skeet
Vous sont corrects, ils ne peuvent contenir qu'une seule expression.
OriginalL'auteur Patrick Karcher